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

それらはそれ自体が拡張メソッドではなく、単なるバグが優れた機能になっただけです。

これら 2 つのメソッドの類似点は、どちらも最初のパラメーターとして文字列を持っていることです。したがって、ここで機能するトリックは、配列 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)

2つの異なる方法で呼び出すことができます。

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 に答える