我正在为D语言实现一个动态类型库,期间遇到了一个有趣的问题。
目前,我已经成功地创建了一个名为dynamic()
的函数,它返回一个对象的动态版本。
例如:
import std.stdio, std.dynamic.core;
class Foo
{
string bar(string a) { return a ~ "OMG"; }
int opUnary(string s)() if (s == "-") { return 0; }
}
void main(string[] argv)
{
Dynamic d = dynamic(new Foo());
Dynamic result = d.bar("hi");
writeln(result); // Uh-oh
}
我遇到的问题是
writeln
试图使用编译时反射来确定如何处理 result
。
它首先尝试什么?是 isInputRange!(typeof(result))
问题是它返回了true!为什么?因为我必须假设所有它需要的成员都存在,除非我能在运行时证明否定——这时已经太晚了。所以程序尝试在 result
上调用 front
、popFront
和 empty
,从而导致程序崩溃。
我想不出修复这个问题的方法。有人有什么想法吗?