2

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

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. 我看不出是什么让它们相似。
4

2 回答 2

7

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

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

U foo (T[] t, other params)

可以通过做来调用

arr.foo(some arguments matching other params)
于 2011-01-21T11:52:21.473 回答
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);

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

于 2011-01-21T19:45:48.803 回答