問題タブ [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.
python - Pythonと辞書のようなオブジェクト
辞書用のpython3.1ディープアップデート関数(親ディクショナリ内にある子ディクショナリを再帰的に更新する関数)が必要です。
しかし、将来的には、私の関数は辞書のように動作するがそうではないオブジェクトを処理する必要があると思います。isinstance
さらに、andの使用は避けたいと思いtype
ます(ほとんどすべてのPythonistaのブログで読むことができるので、それらは悪いと見なされているため)。
しかし、ダックタイピングはPythonの哲学の一部なので、オブジェクトが辞書のようなものであるかどうかをどのように確認できますか?
ありがとう!
編集:答えてくれてありがとう。念のため、私がコーディングした関数は次の場所にあります:http: //blog.cafeaumiel.com/public/python/dict_deep_update.py
c# - Silverlight用のダックタイピングライブラリ?
Silverlight用のダックタイピングライブラリはありますか?本格的な.NETFrameworkにはいくつかありますが、もっと軽いものを探しています。
.net - 型指定されていない.netDataSetはダック型のDTOですか?
さて、インデクサーを使用してデータセット内のデータ行のフィールドにアクセスしていますが、これを単なる構文上の機能と見なしてみましょう。ここまで進んで、それをゲッターとセッター、つまりデータ転送オブジェクトに還元されたダックタイプのものと呼びますか?
dry - ダックタイピング: この状況をどのように扱いますか
Python は比較的初心者です。最近、データ型がブール値であることの検証に関して質問を投稿しました。[複数の属性に記述子 (編集: 単一のデコレータではない) を使用しますか?
与えられた答えは、アヒルのタイピングを参照しました。簡単な例があり、理解していることを確認したいと思います。私のコードが次の場合:
ダックタイピングをある程度正しく理解している場合、上記のクラスでは、bool1 が常にブール値であると信じています。bool1 == False または bool1 == True かどうかを確認する必要はありません。誰かが私のモジュールを間違って使用した場合、つまり bool1 = None の場合、メソッドは、問題があったことを示さずに実行したくないことを実行し、ロケット船の人々が死亡します。
bool1 が常に真のブール値であることを保証するコードを書くことができた別の方法は次のとおりです (上記のリンクの BooleanDescriptor のクレジット!):
最初の方法 (チェックしない) が正しい方法だと理解していますか? つまり、最初の例で次のように明示的にコードを書くこともできたはずです。
しかし、bool1 を使用するすべてのメソッドなどでこれを行う場合、そもそも bool1 が真のブール値であることを検証しないのはなぜですか (DRY!)!?!? :-)
ありがとう!
ポール
ruby - Ruby で to_int と to_str を実装した結果
文字列値と int 値 (それぞれコマンド出力と終了コード) を公開するクラスがあります。to_s
andを介してそれらを公開することに加えて、次のようにandto_i
も使用しています。to_str
to_int
この背後にある私の考えは、このオブジェクトをできるだけ多くの状況で使用できるようにすることです。文字列または整数に強制可能にすると、その使いやすさが向上します。たとえば、オブジェクトを文字列と連結できます。
(これを int 強制の例として使用したかったのですが、Fixnum.+ が気に入らないため、実際には機能しません:)
私がこれまでに読んだものはすべて、これはおそらく「悪い」ことだと言っています。共通のテーマは次のようになりto_s
ます。to_i
to_str
to_int
私のクラスが「基本的に」文字列でも整数でもないことは間違いありません。ただし、このルールにはいくつかの問題があります。
- クラスの柔軟性/使いやすさが低下します。例: Status.to_str がなければ、String.+ を使用して Status 出力を他の文字列と連結することはできませんでした。
- ダックタイピングの精神に反しているようです。オブジェクトのユーザー (つまり、パラメータとしてそれを取得するメソッド) は、そのオブジェクトが何であるかを気にするべきではなく、何ができるかだけを気にする必要があります。(この場合、"do" は "string/int として表現できる" という意味です。)
- 「基本的には文字列/整数です」という議論は、私にはかなりあいまいです。たとえば、それ
Float.to_int
がよく言及されていることがわかります。話は、浮動小数点数には常に整数コンポーネントto_int
があるため、有効な方法であるということです。ただし、これは間違っていると思います: Float は整数ではありません(整数以外のコンポーネントがあるため)。Float を (切り捨てにより) 整数に合法的に変換できますが、(終了コード以外のすべての情報を「切り捨てる」ことにより) Status も整数に変換できると言えます。
だから、私の質問は次のとおりです。実装に実際の(つまり、実際的な)害to_str
はありto_int
ますか?
更新: Jörg W Mittag は、私に何かを考えさせた例を示しました。質問を言い換えると、既に/を持っているのに、本当にto_str
/を持つ必要があるのでしょうか? (特定のメソッドがすでに以上を期待しているという事実に加えて)to_int
to_s
to_i
to_str
to_s
たとえば、Jörg の Array.join の例では、配列メンバーは to_s を介して変換され、セパレータは to_str を介して変換されます。しかし、これは本当に必要ですか?代わりに Array.join がseparator.to_s を呼び出すと、より多くのオブジェクト (例: 整数、シンボルなど) を正常に渡すことができ、より多くの柔軟性を得ることができます。Ruby は、この分離によってメリットがありますか?
c# - C#での安全なダックタイピングの実装
Goがインターフェイスをどのように処理するかを見て気に入った後、C#で次のような同様のダックタイピングを実現する方法について考え始めました。
このDuckTyper.Adapt
メソッドはSystem.Reflection.Emit
、その場でアダプターを作成するために使用します。多分誰かがすでにこのようなものを書いています。モックフレームワークがすでに行っていることとそれほど変わらないと思います。
ただし、実際に適切なメソッドMallard
がない場合、実行時に例外がスローされます。IDuck
コンパイル時の早い段階でエラーを取得するには、MallardToDuckAdapter
回避しようとしているものとまったく同じものを作成する必要があります。
もっと良い方法はありますか?
編集:どうやら私が「安全なダックタイピング」と呼ぶものの適切な用語は構造的タイピングです。
duck-typing - 「ダックタイピング」の語源は?
「ダックタイピング」という名前の背後にある話はありますか。アヒル?なぜ「もしそれが_のように見え、_のように聞こえるなら、それを_と呼びましょう」.
フライング サーカスのスケッチのように聞こえますが、覚えていません。名前の裏にストーリーはありますか?
objective-c - Objective-C の継承方法のマッチング
Objective-C のクラス継承に関連する奇妙なシナリオに遭遇しました。
基本クラス X から継承する 3 つのクラス A、B、および C があるとします。クラス A、B、および X にはコンストラクターがあります。
唯一の違いは、すべてのクラスがデリゲートに異なるプロトコルを使用することです。
A と B に対して、コンパイラは C のメソッドを使用しようとします。警告は、クラス C のコンストラクターが必要とするプロトコルが提供されたデリゲートによって実装されていないことを通知します。各クラスには、クラス独自のコンストラクターに適切なプロトコルを実装するデリゲートがあるため、デリゲート自体に問題はありません。実行時にはすべてが正常に機能し、すべてのクラスに対して適切な関数が呼び出されます。
コンストラクターが匿名 ID の代わりに A*、B*、または C* を返すようにしてみましたが、それでも問題は解決しません。
機能する唯一のことは、次のように適切なクラスにキャストすることです。
これは余分で不必要に思えます。私はおそらくここで明らかな何かを見逃しています。
language-design - ダックタイピング、動的でなければなりませんか?
ウィキペディアはダックタイピングについて次のように述べていました:
オブジェクト指向プログラミング言語を使用したコンピューター プログラミングでは、ダック タイピングは動的型付けのスタイルであり、特定のクラスからの継承や特定のインターフェイスの実装ではなく、オブジェクトの現在のメソッドとプロパティのセットによって有効なセマンティクスが決定されます。
(* 編集者注: この質問が投稿されて以来、ウィキペディアの記事は編集され、「動的」という単語が削除されました。)
構造型付けについて次のように述べています。
構造型システム (またはプロパティ ベースの型システム) は、型システムの主要なクラスであり、型の互換性と等価性は、明示的な宣言ではなく、型の構造によって決定されます。
次のように、構造的サブタイピングとダックタイピングを対比します。
[構造システム] は、実行時にアクセスされる構造の一部のみが互換性をチェックされる ... ダック タイピングとは対照的です。
しかし、ダックタイピングという用語は、少なくとも構造的なサブタイピングシステムを直感的に包含しているように思えます。実際、ウィキペディアには次のように書かれています。
概念の名前 [ダックタイピング] は、ジェームズ ウィットコム ライリーによるアヒル テストを指し、次のように表現できます。「アヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴く鳥を見たとき私はその鳥をアヒルと呼んでいます。」
だから私の質問は: 構造的サブタイピングをダックタイピングと呼べないのはなぜですか? ダック型として分類できない動的型付け言語も存在しますか?
追記:
reddit.com でdaydreamdrunkという名前の誰かが雄弁に言ったように、「アヒルのようにコンパイルし、アヒルのようにリンクするなら...」
あとがき
多くの答えは、基本的に、ここで既に引用したことを再ハッシュしているだけのようで、より深い質問に対処していません。動的型付けと構造的サブタイピングの両方をカバーするためにダックタイピングという用語を使用しないのはなぜですか? 構造的なサブタイピングではなく、ダックタイピングについてのみ話したい場合は、動的メンバー検索と呼んでください。私の問題は、ダックタイピングという用語について何も言わないことです。これは動的言語にのみ適用されます。
.net - .NETでのジェネリックスとダックタイピングXML?
私はデータインスタンスのいくつかのXML表現を扱っています。.NETシリアル化を使用してオブジェクトを逆シリアル化していますが、XMLを表すクラスを作成する必要があるため、私の魂の何かが妨げられています...以下は私がやりたいことですが、構文かどうかはわかりません可能です:
次のことを考慮してください。
これを使ったアプローチについて何か提案はありますか?