私はDが新しく、コンパイル時にチェックされたダックタイピングが便利かどうかは疑問でした。Duck typing in D
たとえば、一連のメソッドを定義し、それらのメソッドを関数に渡す型に対して定義する必要があります。これは、D型のinterface
と少し異なります。なぜなら、「型XはインタフェースYを実装する」と宣言する必要がないからです。メソッドが見つかるか、コンパイルが失敗します。また、これが構造体やクラスだけでなく、どのような型でもできるようにするのは良いことです。私は見つけることができる唯一のリソースは、以下のアプローチがこれを行うにはまともな方法だろうことを示唆している、this email threadた:
void process(T)(T s)
if(__traits(hasMember, T, "shittyNameThatProbablyGetsRefactored"))
// and presumably something to check the signature of that method
{
writeln("normal processing");
}
...と、次のようにライブラリコールを実装にそれを作ることができることを示唆しています
struct Interface {
bool foo(int, float);
static void boo(float);
...
}
static assert (Implements!(S, Interface));
struct S {
bool foo(int i, float f) { ... }
static void boo(float f) { ... }
...
}
void process(T)(T s) if (Implements!(T, Interface)) { ... }
クラスまたは構造体で定義されていない関数に対してこれを行うことは可能ですか?それを行うための他の/新しい方法はありますか?同様のことが行われていますか?
明らかに、この制約のセットは、Goのタイプのシステムに似ています。私は炎戦を始めようとはしていません - 私はGoがうまくいくようにDを使用しています。
すべてのユースケースを処理する単一の機能を作成しようとしていますか?私はこれには[静的foreach](http://d.puremagic.com/issues/show_bug.cgi?id=4085)が必要だと思いますが、わかりません。たぶん、CTFEの魔法が使えるのでしょうか?また興味があります:http://www.digitalmars.com/d/archives/digitalmars/D/static_foreach_108369.html – tjameson
@tjamesonはい、上記の例では、あなたが 'Interface 'struct at compile time。しかし、同じ目標を達成するための他の方法もあります。 – Dan
Dにはラップアンドラップがあります(http://dlang.org/phobos-prerelease/std_typecons.html#.wrapとhttp://dlang.org/phobos-prerelease/std_typecons.html#.unwrap)アヒルタイピング。 – DejanLekic