在D中使用动态类型,这是一种静态类型语言

Meh*_*dad 8 d dynamic-typing

当我遇到一个有趣的问题时,我正在为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
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是writeln尝试使用编译时反射来弄清楚如何对待result.

它尝试的第一件事是什么? isInputRange!(typeof(result))

麻烦的是,它返回真实!为什么?因为我必须假设它所需要的所有成员都存在,除非我能在运行时证明这一点 - 这为时已晚.因此,该程序试图调用front,popFront以及emptyresult,撞毁我的程序.

我想不出办法解决这个问题.有没有人有想法?

rat*_*eak 1

std.variant使用which 实现动态类型所需的一切(以及相当多的语法糖)有什么问题