嘿,我正在努力获取这些语法对我来说有意义:

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"

从根本上讲,这使我相信d在d中可以从csharp中知道的扩展方法。我的问题是:

  1. 我不是100%确定我在这里查看正确的功能声明
  2. 我看不出是什么使它们相似。
有帮助吗?

解决方案

它们不是per-se的扩展方法,只是一些变成整洁功能的错误。

这两种方法之间的相似性是两者都有一个字符串作为第一个参数。因此,这里工作的窍门是给定一个数组t [] arr和一个函数

U foo (T[] t, other params)

可以通过做

arr.foo(some arguments matching other params)

其他提示

在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);

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top