gpt4 book ai didi

d - 在静态类型语言 D 中使用动态类型

转载 作者:行者123 更新时间:2023-12-04 08:37:41 27 4
gpt4 key购买 nike

当我遇到一个有趣的问题时,我正在为 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))
问题是,它返回 真实 !为什么?因为我必须假设它需要的所有成员都存在,除非我可以在运行时证明不存在——这为时已晚。所以程序尝试调用 front , popFront , 和 emptyresult ,使我的程序崩溃。

我想不出办法来解决这个问题。有人有想法吗?

最佳答案

您正在尝试使两个根本不同的概念一起工作,即模板和动态类型。模板非常依赖静态类型,isInputRange 通过检查类型具有哪些属性或方法来工作。您的动态类型在编译时被视为具有每个属性或方法,因此它被视为满足每个静态鸭子类型接口(interface)。
因此,要使 Dynamic 在静态类型的环境中工作,您必须在某些地方提供更多的静态信息。

我可以看到的一些解决方案:

  • 为大量使用的函数提供您自己的动态类型实现。您遇到的整个问题是由于您尝试使用假设静态类型和动态类型的通用函数。
  • 显式地使动态范围内的字符,并照顾自己转换为基础数据的字符串。 (如果 isInputRange 问题不存在,您无论如何都必须有一个自定义的 toString 方法,否则它的结果将再次是动态类型)。这可能会使 writeln(d);工作。
  • 为动态提供包装器,允许您将动态类型传递给各种模板化函数。 (那些只会展示一个静态接口(interface)并将所有调用转发到动态)。

  • 例如:
    Dynamic d;
    // wrap d to turn it into a compile-time input range (but NOT eg a forward range)
    Dynamic d2=dynamic(map!q{a*2}(dynInputRange(d)));
    // profit

    4.将成员模板添加到 Dynamic,它允许静态禁用某些成员函数名称。

    例如:
    static assert(!isForwardRange!(typeof(d.without!"save")));

    关于d - 在静态类型语言 D 中使用动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102648/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com