6

誰かが何をstd.algorithm.map返すかを言うことができますか? (いくつかのドキュメントページへのリンクは非常に高く評価されます)エラーメッセージから、その結果は次のタイプですResult

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

http://dlang.org/phobos/std_algorithm.html#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

これから、私ができることとできないことは明確ではありません。

4

3 に答える 3

7

std.algorithm.map渡されたものと同じジャンルの範囲 (フォワード、双方向、ランダムなど) であるという事実を超えて、何が返されるかを知ったり気にしたりする必要はありません。ほとんどの範囲ベースの関数でそうです。ほとんどの場合、渡されたものをラップする新しい範囲か、渡されたのとまったく同じタイプの範囲のいずれかを返します (たとえばmap、前者findは行い、後者は行います)。使用auto:

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

によって返される範囲mapは遅延です。それを反復処理するまで何もしません (その後front、基になる範囲の連続ごとに指定された関数を呼び出します)。その方が効率的です(無限範囲を有効にするだけでなく)。正確な戻り値の型は、渡した範囲の型に依存し、ローカルでmapあるため、直接作成することはできません。autoタイプを推測するか、タイプtypeofを取得するには、次のいずれかを使用する必要があります。

typeof(map!"a"(x)) y = map!"a"(x);

ただし、通常は、typeof直接初期化できない変数が必要な場合にのみ使用します。autoほとんどの場合、行く方法です。

map結果から(または他の範囲から)配列を作成する必要がある場合は、次を使用しstd.array.arrayます。

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

範囲についてよく知らない場合は、おそらくこれを読む必要があります。残念ながら、現在、範囲を説明する dlang.org の記事はありませんが、そのリンクは、D コミュニティのメンバーの 1 人がトルコ語で書き、英語に翻訳している本の章へのリンクであり、範囲をかなりカバーしています。良い。

編集

Walter Bright は最近、特に関数に対してローカルであるが関数によって返される型についての記事を書きました。クールな名前も付けられます: Voldemort Types in D.

于 2012-05-03T20:35:16.070 に答える
3

結果の範囲は「レイジー」であり、最終結果を表すものではありません。

std.arrayをインポートして次のようにラップすると、配列に変換できます。

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

また

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

dmd2.059以降を使用している場合

マップの結果は、foreachを使用して直接繰り返すこともできます。

auto result = std.algorithm.map!"a"(x);
foreach (element; result)
  writeln(to!string(element));
于 2012-05-03T20:30:12.063 に答える
1

Resultはヴォルデモート タイプmap()であるため名前を付けられない内部のタイプです。

Phobosの実際のソース コードは次のようになります。

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

ソース コードを調べると、Resultそれが範囲に過ぎないことに気付くでしょう。通常のpopFront()andempty()メソッドと、返される必要がある範囲の種類に応じたその他のメソッドがあります。型推論を使えば、

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

rとして入力されResultますが、直接インスタンス化することはできません。

于 2012-05-09T16:48:31.360 に答える