問題タブ [dynamic-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Pythonで適切なタイプに強制/変換するのに最適な場所
私はまだPythonにかなり慣れていないので、動的型付けに慣れようとしています。特定の型のパラメーターを期待する関数またはクラスがありますが、それに対して強制可能な別の型の値を取得できる場合があります。たとえば、が期待しているfloat
が、代わりにintまたはdecimalを受け取る場合があります。または、文字列を期待するかもしれませんが、代わりに__str__
特別なメソッドを定義するオブジェクトを受け取ります。
引数を正しいタイプ(およびその理由)に強制するためのベストプラクティスは何ですか?関数/クラスまたは呼び出し元でそれを行いますか?発信者の場合、関数でもチェックしますか?例えば。
代替案1:
代替案2:
代替案3:
私はすでにこの答えとこれを読んでいて、Pythonで型をチェックするのは「悪い」と言っていますが、静的に型付けされたコンパイラによって即座に検出される非常に単純なバグを追跡するのに時間を無駄にしたくありません言語。
design-patterns - OOPと動的型付け(静的vs動的ではない)
静的に型付けされた環境(RubyとC#など)とは対照的に、動的に型付けされた環境では、どのOOP原則が適用されたり、異なって適用されたりしませんか?これは静的対動的な議論の呼びかけではありませんが、どちらか一方に適用され、他方には適用されない、どちらかの側に受け入れられた原則があるかどうか、または異なる方法で適用されるかどうかを確認したいと思います。「継承よりも構成を優先する」などのフレーズは、静的に型付けされたOOPの文献でよく知られています。それらは動的な側面にも同じように適用できますか?
たとえば、動的に型付けされた環境では、結合の粒度はメソッドのレベルを超えないように見えます。言い換えると、特定の関数呼び出しは、呼び出し元をその特定のインターフェイスに結合するだけです。これは、クラスが満たす可能性があります。言い換えると、特定のアヒルのように鳴くものはすべてです。
一方、Javaでは、結合の粒度はパッケージと同じくらい高くなる可能性があります。特定のメソッド呼び出しは、別のクラス/インターフェースとのコントラクトを確立するだけでなく、それをそのクラス/インターフェースのパッケージ/jar/アセンブリに結合します。
このような違いは、異なる原則とパターンを生み出しますか?もしそうなら、これらの違いは明確にされていますか?Ruby Pickaxeの本には、この方向に少し進むセクションがあります(Duck Typing / Classes Are n't Types)が、他に何かあるのではないかと思います。Rubyのデザインパターンを知っていますが、読んでいません。
編集-Liskovは静的環境と同じように動的環境に適用しないと主張されてきましたが、私はそれが適用されると考えずにはいられません。一方では、クラス全体との高レベルの契約はありません。しかし、特定のクラスへのすべての呼び出しは、リスコフが規定する方法で子クラスが満たす必要がある暗黙のコントラクトを構成するのではありませんか?次のことを考慮してください。「いくつかのバーのことをする」の呼び出しは、子クラスが参加する必要がある契約を作成します。これは「特殊なオブジェクトを基本クラスのように扱う」場合ではありませんか?
objective-c - Objective-C でオブジェクト型をサブクラス化されたオブジェクト型に変換する
クラス A とクラス B があるとします。クラス B はクラス A のサブクラスです。クラス A にはいくつかのプロパティが含まれており、クラス B はそのサブクラスに固有のプロパティを追加することによってクラス A スーパークラスを拡張します。クラス A オブジェクトを作成しましたが、クラス B によって提供される追加のプロパティにデータを追加できるように、実行時にオブジェクトをクラス B タイプのオブジェクトに変換したいと考えています。Objective-C でこれを行う方法はありますか? ありがとう!
objective-c - 動的に型指定されたクラスは、メソッドの選択時にコンパイラの警告を生成します
おそらくこれは間違った方法ですが、どうすればコンパイラの警告を消すことができるのだろうか?
さて、RelatedClass の実装を見てみましょう...
これは有効なアプローチのように思えるので、なぜ警告が表示されるのか疑問に思っています。これをコンパイラに「説明」する方法はありますか?
このタイプのリンケージが奨励されているか、または相互に通信する必要がある 2 つの関連する相互依存クラスをリンクするより良い方法があるかどうか、誰かが親切に共有できますか?
SomeView は RelatedClass をメンバーとして定義されているため、RelatedClass で送信者オブジェクト (SomeView) を静的に宣言することはできません。再帰の問題が発生するようです...
助言がありますか?
programming-languages - どの言語が動的に型付けされてコンパイルされますか(そしてどの言語が静的に型付けされて解釈されますか)?
動的型付けと静的型付けについて読んでいると、静的に型付けされた言語はコンパイルされ、動的に型付けされた言語は解釈されるという仮定に反し続けます。私は一般的にこれが真実であることを知っていますが、私は例外に興味があります。
これらの例外の例をいくつか挙げるだけでなく、これらの言語がこのように機能することが決定された理由を説明してもらいたいと思います。
terminology - 静的/動的 vs 強い/弱い
これらの用語がプログラミングのいたるところで使われているのを目にしますが、それらが何を意味するのか漠然とした考えを持っています。検索すると、実際にスタックオーバーフロー全体でそのようなことが尋ねられていることがわかります。私の知る限り、言語の静的/動的型付けは、強い/弱い型付けとは微妙に異なりますが、その違いが何であるかはわかりません。情報源が異なれば、異なる意味を使用しているようであり、用語を同じ意味で使用しているようです. 両方について話し、実際に違いを説明している場所を見つけることができません。誰かが私と他の世界のためにここでこれを明確に説明してくれたらいいのですが.
database - SQLite3の動的型付け
SQLite3は、他の種類のSQLとは対照的に、静的型付けではなく動的型付けを使用します。SQLiteのWebサイトには次のように書かれています。
ほとんどのSQLデータベースエンジン(私たちが知る限り、SQLite以外のすべてのSQLデータベースエンジン)は、静的で厳密な型指定を使用します。静的型付けでは、値のデータ型はそのコンテナー(値が格納されている特定の列)によって決定されます。
SQLiteは、より一般的な動的型システムを使用します。SQLiteでは、値のデータ型は、コンテナーではなく、値自体に関連付けられています。
たとえば、文字列を整数列に格納できるので、これはまさにあなたが望まないことのように思えます。
ページは続きます:
... SQLiteの動的型付けにより、従来の厳密に型付けされたデータベースでは不可能なことが可能になります。
2つの質問があります:
- ユースケースの質問:SQLite3の動的型付けが有益な例は何ですか?
- 歴史的/設計上の質問:動的型付けでSQLiteを実装する動機は何でしたか?
programming-languages - 動的な、おそらく弱い型付けを備えたコンパイル済み* プログラミング言語はありますか?
動的および/または弱い型付けを特徴とする、マシン コード/バイナリ (VM によって実行されるバイトコードではなく、型付けを考慮するとまったく異なるもの) にコンパイルされるプログラミング言語があるかどうか疑問に思いました。
次のようなコンパイル済み言語を考えてみてください。
- 変数を宣言する必要はありません
- 実行時に変数を作成可能
- 関数はさまざまな型の値を返すことができます
質問:
- そのようなプログラミング言語はありますか?
- (なぜだめですか?
動的でありながら強力な型付けされたコンパイル済み言語は本当に理にかなっていると思いますが、それは可能ですか?
c# - .NET 4.0の新しい「動的」変数タイプはCLRの単一/複数メソッドディスパッチの問題を解決しますか?
シングルディスパッチの問題は、JavaやC#などの静的に型指定された言語を使用したコーディングに従事する人々にはほとんどよく知られています。基本的な考え方は次のとおりです。
receiver
実行時ポリモーフィズムにより、たとえば次のタイプ(実行時タイプ)に応じて適切なメソッド呼び出しにディスパッチできます。
mything
メソッド呼び出しは、の実行時型、つまり。に従って実行されますCat
。これはシングルディスパッチ機能です(Java / C#に存在します)。
ここで、ランタイムタイプのレシーバーだけでなく、(複数の)引数のタイプでもディスパッチする必要がある場合は、少し問題が発生します。
2番目のメソッドは呼び出されません。これは、「consumer」コードでは、さまざまなタイプのオブジェクト(私の例では訪問者)を共通のスーパータイプまたはインターフェイスで処理する傾向があるためです。
動的型付けでは多重ディスパッチポリモーフィズムが可能であり、C#4.0にはその動的キーワードがあるためです;)
java - 実行時の型解決に関する Java のベスト プラクティス
緩く型付けされたオブジェクト (JavaScript など) として動作するクラス (または同じインターフェイスを実装するクラスのセット) を定義しようとしています。それらはあらゆる種類のデータを保持でき、それらに対する操作は基になる型に依存します。
私はそれを 3 つの異なる方法で動作させていますが、理想的な方法はありません。これらのテスト バージョンでは、文字列と整数のみが許可され、唯一の操作は追加です。整数を追加すると整数値の合計になり、文字列を追加すると文字列が連結され、整数を文字列に追加すると整数が文字列に変換され、文字列と連結されます。最終バージョンには、より多くの型 (Double、Array、新しいプロパティを動的に追加できる JavaScript のようなオブジェクト) とより多くの操作が含まれます。
方法 1:
...DynString1 についても同様
方法 2: public interface DynObject2 { @Override public String toString(); public DynObject2 add(DynObject2 d); }
...DynString2 についても同様
方法 3:
if-else ロジックを使用すると、型を格納する代わりに value.getClass()==Integer.class を使用できますが、より多くの型を使用すると、これを変更して switch ステートメントを使用し、Java では switch でクラスを使用できません。
とにかく...私の質問は、これを行うための最良の方法は何ですか?