题
嘿,我正在努力获取这些语法对我来说有意义:
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中知道的扩展方法。我的问题是:
- 我不是100%确定我在这里查看正确的功能声明
- 我看不出是什么使它们相似。
解决方案
它们不是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);
但是,由于尚未实现统一函数调用语法,因此您只能使用数组进行此类操作。人们以字符串以这种方式进行编程,而不是将它们作为第一个论点传递给函数是很普遍的。
不隶属于 StackOverflow