問題タブ [duck-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.
java - Java:変数がインターフェースを実装していることを宣言する方法は?
Objective-C では、次のことができます。
delegate
(タイプ の変数) がプロトコルid
に準拠している(またはJava 言語でインターフェースを実装している)と言えます。HTTPRequestDelegate
HTTPRequestDelegate
HTTPRequestDelegate
そうすれば、プロトコルによって定義されたメッセージを に送信するたびに、コンパイラはそれが応答delegate
することを理解します。delegate
Javaでこれを行うにはどうすればよいですか (つまり、ダック タイピング/ 動的タイピング)。
python - Pythonで「ダックタイピング」を処理する方法は?
私は通常、コードをできるだけ一般的にしたいと思っています。私は現在、単純なライブラリを作成していますが、ライブラリでさまざまなタイプを使用できることは、今回は非常に重要だと感じています。
進む方法の1つは、人々に「インターフェース」クラスをサブクラス化するように強制することです。私には、これはPythonよりもJavaのように感じissubclass
られ、各メソッドで使用することもあまり魅力的ではありません。
私の好ましい方法は、オブジェクトを誠実に使用することですが、これにより、いくつかのが発生しAttributeErrors
ます。それぞれの危険な呼び出しをtry/exceptブロックでラップすることができます。これもちょっと面倒なようです:
エラー処理をスキップして、必要なメソッドを持つオブジェクトのみを使用することを期待する必要がありますか?[x**2 for x in 1234]
私が実際にaを取得し、aを取得しTypeError
ないような愚かなことをした場合AttributeError
(intは反復可能ではありません)、どこかでタイプチェックが行われている必要があります-同じことをしたい場合はどうなりますか?
この質問は一種の自由形式になりますが、上記の問題をクリーンな方法で処理するための最良の方法は何ですか?確立されたベストプラクティスはありますか?たとえば、上記の反復可能な「タイプチェック」はどのように実装されますか?
編集
AttributeError
sは問題ありませんが、ネイティブTypeErrors
関数によって生成されるものは、通常、エラーを解決する方法に関する詳細情報を提供します。これを例に取ってください:
私の図書館ができるだけ役立つようにしたいと思います。
ruby - タイプチェックを回避しながら配列またはセットのような値を検出する方法
Array/Setのようなオブジェクトまたはハッシュの引数を受け入れるメソッドがあります。メソッドの要点は次のようなものです。
このメソッドはIDオブジェクトのセットを受け入れ、それをMongoDBのハッシュ条件に変換します。
上記のコードに関する2つの問題:
- 標準ライブラリから「set」が必要ない場合は失敗します。チェックを実行するためだけに依存関係を要求したくありません。
- 厳密な型比較はしたくありません。配列またはセットのような値を受け入れ、それを。を使用して値の配列にキャストしたいと思います
to_a
。
このチェックをどのように実行しますか?覚えておくべきいくつかの考慮事項:
- メソッドを確認できまし
to_ary
たが、Setが応答しませんto_ary
。このメソッドを実装するオブジェクトは基本的に配列である必要があり、Setは基本的に配列ではないことに同意します。Rubyでto_intとto_strを実装した結果を参照してください。 to_a
ハッシュが応答するので確認できませんArrayとSetに共通しているが、Hashには共通していないメソッドは次のとおりです。
/li>
私はこのようなもので行くことにしました:
交差点は、集合のようなオブジェクトが持つ演算子である可能性が高いためです。しかし、これについてはよくわかりません。
ruby - Rails-単一テーブル継承-欠陥のあるキャストアプローチ?
だから私は最近単一テーブル継承を調べていて、この一般的な質問/回答を見つけました:
質問:STIでBeta <Alphaと仮定して、オブジェクトのクラスを
obj
AlphaからBetaにどのように変更しますか?回答:ルビーはダックタイプの言語なので、キャストは使用しません。ただし、必要なのは「type」変数を「Beta」に設定してオブジェクトを保存することだけです。次にAlphaオブジェクトをロードすると、タイプはBetaになります。
ただし、このアプローチは私にはうまくいかないようです。objは正しく保存されますが、ベータオブジェクトとしてはまったく機能していないようです。ベータ版の検証を実行せずに保存し、チェックobj.respond_to?(:beta_method) #beta_method being a method in the beta class
するとfalseが返されました。このアプローチは機能しませんか?正しいアプローチはありますか?それとも私は単に何か間違ったことをしているのですか?
編集
Alpha.last.respond_to(:beta_method)を実行すると、falseが返され、Beta.last.respond_to(:beta_method)がtrueを返すことがわかりました(ただし、Alpha.lastとBeta.lastの両方が同じオブジェクトを返しました)。興味深い開発?それでも、誰かがこれを(rubyが継承を処理する方法に関して)詳細に説明できれば、それは素晴らしいことです。
java - このダックタイピング (Python) を Java ジェネリックに変換するにはどうすればよいですか?
例として、次の単純な Python 関数を考えてみましょう。
そして、ここでそれが実行されています:
この関数には確かに欠陥があります -- 一つには、引数を検証しません。また、戻り値の型を設定する方法についてはよりスマートにする必要があります -- しかし、データ内の要素が整数または浮動小数点数またはその他の数値型。また、デフォルトでは int のリストを返しますが、オプションの quantizer 引数として適切な関数を渡すことで、この型を別のものに変更できます。さらに、データ パラメータがリストの場合、返される値はリストになります。data がタプルの場合、戻り値はタプルになります。(この最後の機能は確かに最も弱い機能ですが、Java で複製することに最も関心がない機能でもあるため、わざわざそれをより堅牢にすることはしませんでした。)
この関数に相当する効率的なJavaを書きたいと思います。つまり、Java の型付けを回避する方法を考え出すことです。私が Java を学んで以来 (かなり前)、言語にジェネリックが導入されました。Javaジェネリックについて学習しようとしましたが、かなり理解できないことがわかりました。これが早期発症の老化によるものなのか、それとも Java で最後にプログラミングして以来 (約 2001 年) に Java の複雑さが大幅に増加したためなのかはわかりませんが、このトピックに関するすべてのページは、以前のページよりも混乱しています。 1。誰かがJavaでこれを行う方法を教えてくれたら本当にありがたいです。
ありがとう!
c++ - C++ テンプレートとダック タイピングの関係は?
私にとって、C++ テンプレートはダック タイピングのアイデアを使用していましたが、これは正しいですか? テンプレートクラスまたはメソッドで参照されるすべてのジェネリック型がダック型であることを意味しますか?
.net - F# and duck-typing
Let's say I defined in F# the following two types:
I was expecting the following method to work for both cats and dogs:
Actually, what seems to happen is that isOld
will only accept cats:
My hopes were that F# would be smart enough to define some kind of "virtual" interface X
for both cats and dogs so that isOld
would accept a X as argument, instead of a Cat
.
This isn't something that F# will in any circumstance handle, am I right? It seems like F# type inference system would not do anything more than what the C# does with var
typed variables.
python - この場合、「Pythonic」と「便利」のバランスをとるにはどうすればよいですか?
クライアントコードによって実装される「インターフェース」があります。
run
は一般に を返す必要docutils
node
がありますが、最も一般的なケースはプレーン テキストであるため、呼び出し元はrun
文字列を返すことができます。これは を使用してチェックtype()
され、 に変換されますnode
。
ただし、私が「Pythonic」を理解する方法は、これは「Pythonic」ではありません。これはtype()
、何かをチェックしても、型のように「振る舞う」ことによって型に「なる」ことができないためです。つまり、「Pythonic」コードはダックタイピングを使用する必要があります。
私は考慮した
しかし、あまり面白くない戻り値の型が名前に含まれているため、私はこれを気にしません。それは気を散らすものです。
私が見逃したアイデアはありますか?また、「悪い」システムで将来遭遇する可能性のある問題はありますか (多かれ少なかれ安全に思えます)?
c# - メンバーの検証とインターフェース
インターフェイスを満たすメソッド/プロパティの存在を確認することで、動的型付けを使用してインターフェイスを適用するRubyのメソッドの準備が整いました。
これは、インターフェースを使用するよりも全体的にどのように優れた設計原則ですか?長所/短所は何ですか。たとえば、C#で同じ概念を実装できますが、同じ値になるかどうかはわかりませんが、
もちろん、これを拡張して、署名やリターンタイプなど、名前だけでなくチェックすることもできます。
考え?
c++ - インターフェイスを使用した C++ コンパイル時のダック タイピング
C++で次のようなことをする方法はありますか
私の意見では、明示的なインターフェイスは、関数が期待するものをより明確にします。ただし、実際のインターフェイス クラスを作成したくありません (非常に面倒です)。