問題タブ [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.
naming-conventions - ダックタイピングの使用とはどのように呼ばれますか
ダックタイピングを使用するプロセスをどのように呼び出す必要がありますか?「ダックタイピングを実行しています」または「アヒルかどうかを確認しています:)」とはどうすればよいですか。
アヒルのチェックは良くないように聞こえます、そしてタイプチェックはそれの単なる間違った名前です。
webforms - 無効なオブジェクト名 'aspnet_Membership'
Visual Studio と c# win フォーム (Web フォーム) を使用しています。MS 2005 Server とリーダー query.here へのオープン接続を試みます - は
そして、それらのテーブルはデータベースに存在します。オブジェクト名 'aspnet_Membership' が無効です。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.Data.SqlClient.SqlException: 無効なオブジェクト名 'aspnet_Membership'。
ソース エラー:
私はイライラしています。前もって感謝します
php - すべての動的言語はダックタイピングをサポートしていますか?
すべての動的言語はダックタイピングをサポートしていますか?
PHPはダックタイピングをサポートしていると思います。そうですか?
java - なぜインターフェースをJavaで宣言しなければならないのですか?
同じシグニチャを持ついくつかのメソッドを持つが、宣言されたJavaインターフェイスに対応しないクラスがいくつかある場合があります。たとえば、JTextField
とJButton
(のいくつかの他の中で javax.swing.*
)の両方にメソッドがあります
ここで、そのメソッドを持つオブジェクトを使用して何かを実行したいとします。次に、インターフェイスが必要です(または、自分で定義することもできます)。
私が書くことができるように:
しかし、悲しいことに、私はできません:
このキャストは違法です。クラスがそのインターフェースを実装することを宣言していないので、コンパイラーはそれがではないことを知っています...しかしそれは「実際に」それを実装します。JButton
CanAddActionListener
これは不便な場合があります。Java自体がいくつかのコアクラスを変更して、古いメソッドで作成された新しいインターフェイスを実装しています(String implements CharSequence
たとえば)。
私の質問は:なぜこれがそうなのか?クラスがインターフェイスを実装することを宣言することの有用性を理解しています。しかし、とにかく、私の例を見ると、なぜコンパイラーは、クラスJButton
がインターフェース宣言を「満たして」(その内部を見て)、キャストを受け入れることができないと推測できないのでしょうか?それはコンパイラの効率の問題ですか、それとももっと根本的な問題がありますか?
答えの要約:これは、Javaが何らかの「構造的型付け」(ダックタイピングのようなものですが、コンパイル時にチェックされます)を考慮に入れていた可能性がある場合です。そうではありませんでした。いくつかの(私にはわかりませんが)パフォーマンスと実装の難しさは別として、ここにははるかに基本的な概念があります。Javaでは、インターフェース(および一般的にはすべて)の宣言は、単に構造的(これらのシグニチャ)がセマンティック:メソッドは特定の動作/意図を実装することになっています。したがって、あるインターフェースを構造的に満たす(つまり、必要なシグニチャーを持つメソッドを持っている)クラスは、必ずしも意味的に満たすとは限りません。(極端な例:メソッドさえない「マーカーインターフェース」を思い出してください!)したがって、Javaは、これが明示的に宣言されているため(そしてそれだけのために)、クラスがインターフェースを実装していると断言できます。他の言語(Go、Scala)には他の哲学があります。
grails - Grails:ダックタイピングと多対多のコレクションクラス
私のGrailsアプリでは、人は何かを好む-そしてその何かはアイデア、決定、グループ、または別の人である可能性があります。
Javaでは、Somethingインターフェースを課して、これらの各クラスをSomethingタイプとして渡すことができるようにします。
Groovy / Grailsでは、SomethingがGroovyクラスであり、FondnessクラスがPersonsをSomethingsにマップするコレクションクラスである場合に機能していました。
この場合、ダックタイピングを活用しようとするとつまずきます。インターフェイスを強制せずに、Personをクラスのグループのいずれかにマッピングするコレクションクラスを設定するにはどうすればよいですか?
アドバイスありがとうございます!G/G開発者がこれにどのように取り組むかを聞いて興奮しています。
-明細書
ruby - これは Ruby のアヒルのタイピングとして正しく見えますか?
車の今後のサービスの必要性についてユーザーを更新するために、車の走行距離とサービス履歴を追跡するプログラムを作成しました。
Car
、、、の 3 つのクラスがCarHistory
ありCarServiceHistoryEntry
ます。3 つ目は簡単です。サービスに関連付けられたすべての属性 (日付、走行距離、実行されたサービスなど) を保持します。CarHistory
クラスは次のとおりです。
- で
initialize
、のクラスをentry
チェックする必要がありますか? - では
add_service_entry
、ダック タイピング (「プログラミング Ruby」での Andy Thomas の議論のように) を採用して、aCarServiceHistoryEntry
を追加できるかどうかをテストしますか?String
セットアップしCarServiceHistoryEntry
て単体テストに追加する代わりに、 a を渡すことはできませんか? - a の必要な属性は配列とメソッドだけなので、
CarHistory
このentries
クラスto_s
をまとめて破棄してクラスに入れるべきcar
でしょうか?
ruby - Rubyパラメータの型確認
Java のバックグラウンドを持つ私は、Ruby のメソッド パラメータに対する完全に無礼な態度に少し動揺しています。Java では、パラメーター x がメソッドが適切に機能するために必要な型であることを保証できましたが、Ruby では、x が整数、文字列、またはそれ以外のものであることを保証する方法がありません。
例: Java で absolute_value メソッドを記述したい場合、ヘッダーは次のようになります。
Rubyでは、次のようになります
この例では、Java コードで、渡されるパラメーターが「Happy Birthday!」ではないことを完全に確信できます。しかし、Ruby コードではそれがわかりません。実行時にコードがクラッシュしないように、Ruby でこの状況を防ぐにはどうすればよいですか?
c# - C#コンパイラでのダックタイピング
注これは、C#でダックタイピングを実装またはエミュレートする方法についての質問ではありません...
数年の間、特定のC#言語機能は、言語自体で定義されたデータ構造に依存しているという印象を受けました(これは、私には常に奇妙な鶏と卵のシナリオのように見えました)。たとえば、foreach
ループはを実装した型でのみ使用できるという印象を受けましたIEnumerable
。
GetEnumerator
それ以来、C#コンパイラはダックタイピングを使用して、オブジェクトがforeachループで使用できるかどうかを判断し、ではなくメソッドを探すことを理解するようになりましたIEnumerable
。これは、鶏肉と卵の難問を取り除くので、非常に理にかなっています。
using
なぜこれがブロックとの場合ではないように思われるのかについて、私は少し混乱していIDisposable
ます。Dispose
コンパイラがダックタイピングを使用してメソッドを探すことができない特別な理由はありますか?この不一致の理由は何ですか?
おそらく、IDisposableの内部で何か他のことが起こっているのでしょうか?
IDisposableを実装していないDisposeメソッドを持つオブジェクトがある理由を説明することは、この質問の範囲外です:)
objective-c - 実行時にプロトコルの適合性を確保するにはどうすればよいですか?
上記により、KVCを活用して、次のように記述できます。
[[Dog new] valueForKey:@"quacks"]; // YES
ただし、objcランタイムを使用して同じKVCメカニズムを活用し、実行時にDuckプロトコルに準拠することはできますか?