2011-01-21 20 views
2

ねえの人々は、私は私には意味をなすために、構文のこれらのビットを取得しようとしている:Dの拡張メソッド?

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で可能であると私に信じさせる。私が持っている問題は、以下のとおりです。

私は、私は彼らが似て作るものが表示されていないことをここ
  • 右側の関数宣言を見ていない、100%確信していること
  • +2

    ドキュメント:http://www.digitalmars.com/d/2.0/arrays.html#func-as-property –

    答えて

    7

    これらは拡張メソッドではなく、きちんとした機能に変わったバグです。

    これら2つの方法の類似点は、どちらも最初のパラメータとして文字列を持つことです。ので、ここで働いているトリックは、Dで

    arr.foo(some arguments matching other params) 
    
    +1

    D2は、この問題をすべてのタイプに一般化するために用意されていましたが、私はWalterがそれに遭遇したかどうかはわかりません。 – FeepingCreature

    +1

    本当にバグだったのか分かりません。私はそれが設計であったと思う(しかし、覚えていないかもしれない)と思う。 OTOHのほとんどの人は、誤った機能であることがいくつかのタイプでしかないという事実を考慮しています。 – BCS

    +3

    機能は「統一関数呼び出し構文」と呼ばれます。そして、それはまだD2の他のタイプのために実装されていません。 http://stackoverflow.com/questions/3868511/non-member-range-functions/3868943#3868943も参照してください。 – stephan

    3

    を行うことによって呼び出すことができる配列を受け取り、任意の関数を配列T [] ARR、および機能

    U foo (T[] t, other params) 
    

    を与えられることあたかもその配列のメンバー関数であるかのように、最初の引数を呼び出すことができます。また、文字列は配列なので、文字列も含まれます。だから、

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

    ようなものを行うことができると思います。しかし均一な関数呼び出し構文がまだ実装されていないとして、あなただけの配列でそういったことを行うことができます。関数への最初の引数として渡すのではなく、文字列を使ってそのようにプログラムするのはよくあることです。