2012-05-03 13 views
6

誰かがstd.algorithm.mapが返すと言うことができますか?std.algorithm.mapの結果

The call map!(fun)(range) returns a range of which elements are obtained by applying fun(x) left to right for all x in range 

ことはない。このことから:エラーメッセージから (一部のドキュメントのページへのリンクが非常に高く評価されるだろう)その結果は、その上にかなり少し情報があるhttp://dlang.org/phobos/std_algorithm.html#mapでタイプResult

ulong[] x = [1,2,3]; 
ulong[] y = std.algorithm.map!"a"(x); // Error: cannot implicitly convert <..> of type Result to ulong[] 

であります明らかに、私はそれで何ができるかできないか。

答えて

7

std.algorithm.mapは、渡されたジャンルと同じジャンル(前方、双方向、ランダムなど)の範囲を超えて返されるものを知っているか、気にする必要はありません。これは、ほとんどのレンジベースの機能ではそうです。渡されたものと同じ範囲の範囲を包む新しい範囲(たとえば、mapは前者、後者はfind)が返されます。 autoを使用します。

ulong[] x = [1, 2, 3]; 
auto y = map!"a"(x); 

mapによって返された範囲は怠惰です。それを反復するまでは何もしません(それは、その下の範囲の各連続するfront上の与えられた関数を呼び出します)。その方法はより効率的です(無制限の範囲を可能にするだけでなく)。正確な戻り値の型は、渡した範囲の型に依存し、mapにローカルなので、直接作成することはできません。あなたは直接初期化できない変数を必要とするとき

​​

しかし、あなたは一般的にのみtypeofを使用する:あなたは型を取得するタイプやtypeofを推論するautoを使用するのいずれかが必要です。 autoはほとんどいつも通りです。あなたがmapの結果から配列を作成する必要がある場合

(または任意の他の範囲から)、その後、std.array.array使用:

ulong[] y = array(map!"a"(x)); 

はあなたが範囲について多くを知らないなら、あなたはおそらく読んでくださいthis。残念ながら、現在dlang.orgに範囲を説明している記事はありませんが、そのリンクは、Dコミュニティのメンバーの1人がトルコ語で書いた、英語に翻訳されている書籍の章のためのものです。よく

EDIT

ウォルター・ブライトは、最近、特に関数のローカルだけでなく、あなたを啓発助けるかもしれない関数によって返されるタイプについての記事を書きました。彼らはクールな名前を得る:Voldemort Types in D

+0

「あなたは知っているか気にしていない」。私が間違っている場合は私を修正してください、私は/ケアを知らなければならない場合、私の例をコンパイルする必要があります – dnsmkl

+1

私はあなたがそれについて知る必要があることを知ってはならないことを意味することを意味します渡されたものと同じジャンルです。正確なタイプは 'map'に固有のもので、あなたが使うものではありません。タイプを推定するには 'auto'を使い、範囲にあるAPIで範囲を使用してください。実際に特定のタイプにしたい場合は、範囲をとり、必要なタイプ(たとえばstd.array.array)を生成する関数を使用してそのタイプに変換する必要があります。 –

+0

地図の結果を使用するために「自動」を使用することを強制されていることは不自然なようです。 とにかく、答えとリンクをありがとう – dnsmkl

3

結果の範囲は「遅延」ですが、最終結果を表すものではありません。

あなたがstd.arrayをインポートし、そのようにそれをラップする場合には、配列に変換することができます:

ulong[] y = array(std.algorithm.map!"a"(x)); 

または

ulong[] y = std.algorithm.map!"a"(x).array; 

あなたは、DMD 2.059以降

を使用している場合、マップ結果は、foreachを使用して直接反復することもできます。

auto result = std.algorithm.map!"a"(x); 
foreach (element; result) 
    writeln(to!string(element)); 
+0

なぜ2.059以降ですか?これは、年齢のために働いています。 –

+0

@ジョナサン彼はUFCS表記を参照しています – fwend

+0

ああ、大丈夫です。私は誤解して、「dmd 2.059以降」がそれ以降の部分を指していると考えました。 'array'は実際にはまだ括弧をつけているはずですが、' -property'でコンパイルされません( '-property'は最終的に正常な動作になるはずです。プロパティ)。 –

1

Resultmap()のタイプで、Voldemort Typeであるため名前を付けることはできません。フォボスで

実際source codeはこのようなものになります。それはいつものpopFront()empty()メソッドを持っており、他の方法:

template map(fun...) if (fun.length >= 1) 
{ 
    auto map(Range)(Range r) if (isInputRange!(Unqual!Range)) 
    { 
     //... 
     struct Result 
     { 
      //... 
     } 
     return Result(r); 
    } 
} 

を使用すると、ソースコードを勉強すれば、あなたはResult範囲以外の何ものでもないことがわかります返される必要がある範囲の種類によって異なります。あなたは型推論を使用している場合は、

auto r = map!("a*a")(data); 

rResultとして入力されますが、あなたはそれを直接インスタンス化することはできません。