D语言中的扩展函数

12
我前段时间买了《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'
}

这样理解是正确的吗?这个特性还没有实现,还是我漏掉了什么?我注意到导入std.range会为数组添加方法,所以在某种程度上似乎已经实现了。

2个回答

12

我理解您所说的“伪成员”是指5.9.1节中讨论的内容。目前,该功能仅在数组中实现,但这是一个计划中的功能。在D社区中,您还会看到它被称为“统一函数调用语法”。

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


在实现UFCS用于除数组之外的内容之前,必须解决许多问题,因此可能永远不会实现,尽管肯定有很多人希望它能以某种形式进入语言中。因此,有相当大的机会在某个时刻发生,但这并非确定的事情。但是,将其用于数组绝对是一个很好的功能。 - Jonathan M Davis
至少这将极大地复杂化成员查找,因为它必须与类似的别名和this交互。 - Trass3r
3
说实话,我不明白 UFCS 的意义。它只是纯粹的语法糖,但会极大地复杂化名称查找。难道说用length(a)代替a.length真的有这么大的问题吗? - Peter Alexander
3
其中一个主要的好处是它使函数链式调用变得容易。因此,你可以用 split(array, ",").map!"fun"().join() 来替换 join(map!"fun"(split(array, ",")))。你可以创建像这样长的链式操作,并使用换行符使代码看起来更加简洁易读。 - Justin W
2
另一个优点是,您可以“贡献”第三方类型提供的接口,以使其可被第四方模板使用。 - BCS

2

是的!我已经知道这个了,但还是谢谢你的评论。我现在已经将其标记为答案,这样其他人也会知道。 - F i L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接