D中的可拓函数

D中的可拓函数,d,dmd,gdc,D,Dmd,Gdc,我不久前买了“D编程语言”。好书,很有教育意义。然而,我在编译书中列出的语言特性时遇到了困难:扩展函数 在书中,Andrei写下了任何可以调用的函数(a,b),比如:a.function(b);所以我应该能够做到这一点: struct-Person{ 字符串名; } void foo(个人,字符串名称){ person.name=姓名; } void main(){ 自动鲍勃=人(); bob.foo(“bob Dole”);//错误:Person没有方法“foo” } 对吗?这项功能还没有实

我不久前买了“D编程语言”。好书,很有教育意义。然而,我在编译书中列出的语言特性时遇到了困难:扩展函数

在书中,Andrei写下了任何可以调用的函数(a,b),比如:a.function(b);所以我应该能够做到这一点:

struct-Person{
字符串名;
}
void foo(个人,字符串名称){
person.name=姓名;
}
void main(){
自动鲍勃=人();
bob.foo(“bob Dole”);//错误:Person没有方法“foo”
}
对吗?这项功能还没有实现,还是我遗漏了什么?我注意到导入std.range会将方法添加到数组中,因此它看起来确实是在某种程度上实现的。

我认为您指的是第5.9.1节中提到的“Psuedo成员”。目前,此功能仅针对阵列实施,尽管这是一项计划中的功能。在D社区中,您还将看到它被称为“统一函数调用语法”


下面是在实现此功能时将关闭的错误报告:

只是想声明,统一函数调用语法已经实现


Dobbs博士有一篇很好的关于它的文章:

在UFC可以用于除数组以外的任何东西之前,有许多问题必须解决,正因为如此,它可能永远不会真正实现,尽管肯定有很多人希望它以某种形式或另一种形式在某种程度上成为语言。所以,有一个不错的机会,它会发生在某个点上,但这不是一件确定的事情。但将其用于阵列肯定是一个很好的功能。至少它会使成员查找变得非常复杂,因为它必须与alias this等进行交互。老实说,我不认为UFCS有什么意义。这纯粹是语法上的甜点,但会使名称查找变得非常复杂。说
length(a)
而不是
a.length
,这真的是一个很大的问题吗?一个主要的好处是它使函数链接变得容易。因此,您可以编写
split(array,“,”)。map!“乐趣”().join()
。您可以创建这样的长链,并使用换行符使其看起来美观干净。另一个优点是,您可以“贡献”第三方类型提供的接口,以使其可供第四方模板使用。是的!肯定已经知道了,但是谢谢你的评论。我现在已经将此标记为答案,以便其他人也知道。