「キャスティング」を除いて、JavaやC++などの静的型言語で変数の型を変更する方法は他にありますか?静的な型指定は、型を変更する場合に変数をキャストする必要があることを意味しますか?
私は動的なタイピングと静的なタイピングの間の主な違いを実践的に理解し、非常に学術的な定義を見つけようとしています。私は自分のコードがどのように見えるかという点で何を意味するのだろうかと思っています。
「キャスティング」を除いて、JavaやC++などの静的型言語で変数の型を変更する方法は他にありますか?静的な型指定は、型を変更する場合に変数をキャストする必要があることを意味しますか?
私は動的なタイピングと静的なタイピングの間の主な違いを実践的に理解し、非常に学術的な定義を見つけようとしています。私は自分のコードがどのように見えるかという点で何を意味するのだろうかと思っています。
強いタイプと弱いタイプの混在と混同しない静的なタイプと動的なタイプが混同されないように注意してください。
これら二つの正反対を自由に組み合わせることができます
一般的に静的な型定義とは、動的に型定義された言語のランタイムエラーである多くのエラーがコンパイラによってキャッチされることを意味しますが、多くの場合、型に関する不安を払うために多くの時間を費やしていますアヒルタイピング)。
強い型指定は、型間の変換は、キャストまたは変換メソッド(たとえば、文字列を整数に解析するなど)を使用して明示的に指定する必要があることを意味します。これは、より多くの型付け作業を意味しますが、システムを暗黙の暗黙の変換を行うと、弱い型指定によって混乱が生じることがあります。ライン。
ありがとう。 –
C++/Javaでは、変数の型を変更することはできません。
スタティックタイピング:変数には、コンパイルタイプで割り当てられた1つのタイプがあり、変更されません。
動的タイピング:実行時に変数の型が変更される可能性があります。 JavaScriptの場合:
js> x="5" <-- String
5
js> x=x*5 <-- Int
25
キャストしないでタイプを変更しますか? –
@マーク、VALUEのタイプは変更できますが、VARIABLEは変更できません。 int i = 42; //フロートに変更することはできません。しかし、i(42)の値は可能である。私の例を見てください。 – strager
変数の型ではありません。値/式の型を変更することができます –
主な違いは、動的に型指定された言語では、実行時にそのメソッドが存在するかどうかを知ることができないということです。静的型付き言語では、コンパイル時にチェックが行われ、メソッドが存在しない場合はコンパイルが失敗します。
明示的なキャストは必要ありません。多くの場合、暗黙のキャストが機能します。例えば
:
int i = 42;
float f = i; // f ~= 42.0
int b = f; // i == 42
class Base {
};
class Subclass : public Base {
};
Subclass *subclass = new Subclass();
Base *base = subclass; // Legal
Subclass *s = dynamic_cast<Subclass *>(base); // == subclass. Performs type checking. If base isn't a Subclass, NULL is returned instead. (This is type-safe explicit casting.)
ただし、変数の型を変更することはできません。ただし、C++でユニオンを使用すると、何らかの動的な型定義を行うことができます。
私のコードがどのようになっているかという点ではどういう意味でしょうか。
タイプシステムは、必ずしもどのようなコードにどのような影響を与えるものではありません。静的型付け、型推論、暗黙的変換(Scalaなど)の言語は、動的に型定義された言語によく似ています。参照:What To Know Before Debating Type Systems。
彼は定型的な言語とダイナミクスのJavaScriptを見てみましょう。 Javaでは、オブジェクトの場合、変数はオブジェクトへの参照です。オブジェクトには実行時型があり、参照には型があります。参照のタイプは、ランタイムオブジェクトのタイプまたはその祖先のタイプでなければなりません。これが多形性の仕組みです。あなたは参照型の階層を上に上がるようにキャストしなければならないが、下にはならない。コンパイラは、これらの条件が満たされていることを確認します。 JavaScriptのような言語では、あなたの変数はまさにその変数です。あなたはそれがあなたが望むどんなオブジェクトでも指し示すことができ、あなたがチェックするまでそれのタイプを知らない。
変換には、変換を行い、同じ相対値を持つ新しい型のオブジェクトを生成するために、toIntegerやtoFloatのような多くのメソッドがあります。 JavaScriptでは変換方法もありますが、新しいオブジェクトも生成されます。
したがって、JavaのtoFloatは既存のオブジェクトを変更しません。私はあなたがx = "abc"とx = "100"と言うことができるRubyを見ています.Javascriptは新しいオブジェクトを生成すると言いましたが、Rubyは既存のオブジェクトを新しい型に変更すると思いました。または私は間違っていますか? –
静的に型指定された言語を使用しているかどうかにかかわらず、あなたのコードは実際には大きく異なっていないはずです。変数のデータ型を動的に型指定された言語で変更できるという理由だけで、そうすることをお勧めします。
たとえば、VBScriptでは、変数の優先データ型を指定するのにハンガリー表記がよく使用されます。そうすれば、コードがタイプを混合しているかどうかを簡単に知ることができます。
同じデータ型にしておくことで、コードが実際に何をしているのか、そしてコードが単純に何もしないのかを判断するのが難しい状況を避けることができます(ハンガリー表記の元の使い方ではありませんでした。正しく動作しません。
Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings
あなたのような、種類を混合されているコードを発見することができますハンガリアン記法を使用する:たとえば
lngId = Request.QueryString("id") ' putting a string in a numeric variable
strId = 42 ' putting a number in a string variable
キャストは変数の型を変更しません。キャストの結果は、どこにでも暗黙的に格納されていない新しい式です。 – recursive