D中的扩展方法?

时间:2011-01-21 10:45:19

标签: extension-methods d phobos

嘿伙计们,我正试图让这些语法对我有意义:

S[] split(S)(S s) if (isSomeString!S)
{
    ...
}

string join(in string[] words, string sep)
{
    ...
}

(见phobos/src/std/string.d

据我所知,这是允许我们执行以下操作的代码:

string[] parts = "/foo/bar/baz".split("/"); // string[] {"foo", "bar", "baz"}
string part = parts.join("-"); // string "foo-bar-baz"

这基本上让我相信类似于我从CSharp中知道的扩展方法在d中是可能的。我遇到的问题是:

  1. 我不是100%肯定我正在寻找正确的功能声明
  2. 我看不出是什么让他们相似。

2 个答案:

答案 0 :(得分:7)

它们本身不是扩展方法,只是一些变成一个简洁功能的错误。

这两种方法之间的相似之处在于两者都有一个字符串作为第一个参数。所以在这里工作的技巧是给定一个数组T [] arr和一个函数

U foo (T[] t, other params)

可以通过执行

来调用
arr.foo(some arguments matching other params)

答案 1 :(得分:3)

在D中,任何以数组作为第一个参数的函数都可以被调用,就好像它是该数组的成员函数一样。因为字符串是数组,所以包括字符串。所以,像

T[] replace(in T[] array, in T[] from, in T[] to)

可以称为两种不同的方式:

auto replacedStr1 = replace("hello world", "hello", "goodbye");
auto replacedStr2 = "hello world".replace("hello", "goodbye");

此功能目前仅适用于阵列(IIRC,它是由于一个允许它的错误而产生的,并且确定它实际上很好用,所以它实际上是语言的一部分),但据说在某些时候,它将适用于所有类型。让它适用于所有类型称为统一函数调用语法。有了这个,你就可以做像

这样的事情了
auto bigger = 2.max(5);

但是由于尚未实现统一函数调用语法,因此您只能对数组执行此类操作。人们用字符串编程,而不是将它们作为函数的第一个参数传递,这是很常见的。