我是 D 的新手,我想知道是否可以方便地进行编译时检查的鸭子类型。
例如,我想定义一组方法,并要求为传递给函数的类型定义这些方法。它与 D 中的稍有不同,interface
因为我不必在任何地方声明“类型 X 实现接口 Y”——这些方法只会被发现,否则编译会失败。此外,最好允许这种情况发生在任何类型上,而不仅仅是结构和类。我能找到的唯一资源是这个电子邮件线程,这表明以下方法将是一个不错的方法:
void process(T)(T s)
if( __traits(hasMember, T, "shittyNameThatProbablyGetsRefactored"))
// and presumably something to check the signature of that method
{
writeln("normal processing");
}
...并建议您可以将其转换为库调用 Implements 以便以下操作成为可能:
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。