D中的扩展函数

F i*_*i L 12 d dmd gdc

不久前我买了"D编程语言".好书,很有教育意义.但是,我在编写本书中列出的语言功能时遇到了麻烦:扩展功能.

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

struct Person {
    string name;
}

void foo(Person person, string name) {
    person.name = name;
}

void main() {
    auto bob = Person();
    bob.foo("Bob Dole");  // ERROR: Person does not have method 'foo'
}
Run Code Online (Sandbox Code Playgroud)

正确?这个功能还没有实现,或者我只是遗漏了什么?我注意到导入std.range会向数组添加方法,因此它似乎在某种程度上实现.

Jus*_*n W 12

我认为你的意思是"Psuedo会员",如第5.9.1节所述.目前,此功能仅适用于阵列,但这是一项计划功能.在D社区中,您还会看到它被称为"统一函数调用语法".

以下是在实现此功能时将关闭的错误报告:问题3382

  • 我不认为UFCS的观点是诚实的.它纯粹是语法糖,但大量复杂的名称查找.说长度(a)`而不是'a.length`真的是一个很大的问题吗? (3认同)
  • 其中一个主要好处是它使功能链变得容易.因此,而不是`join(map!"fun"(split(array,",")))``你写`split(array,",").map!"fun"().join()`.您可以创建这样的长链,并使用换行符使其看起来漂亮和干净. (3认同)
  • 另一个优点是,您可以"贡献"第三方类型提供的界面,以使其可供第四方模板使用. (2认同)

Red*_*edX 2

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

Dr. Dobbs 有一篇关于它的好文章:Uniform Function Call Syntax on Dr. Dobbs