Sie sollten nicht wissen oder interessieren, was std.algorithm.map
zurück über die Tatsache hinausgeht, dass es eine Strecke des gleichen Genres wie das ist, das hereingebracht wird (vorwärts, bidirektional, zufällig, etc.). Bei den meisten bereichsbasierten Funktionen ist dies der Fall. Sie geben fast immer entweder einen neuen Bereich zurück, der den übergebenen Bereich umspannt, oder einen exakt gleichen Typ des Bereichs, der übergeben wurde (z. B. map
tut der erstere; find
tut letzteres). Verwenden Sie auto
:
ulong[] x = [1, 2, 3];
auto y = map!"a"(x);
Der Bereich zurück von map
faul ist. Es macht nichts, bis Sie darüber iterieren (es ruft dann die gegebene Funktion auf jedem folgenden front
des zugrunde liegenden Bereichs). Es ist effizienter (und ermöglicht unendliche Bereiche). Der genaue Rückgabetyp hängt vom Typ des Bereichs ab, den Sie übergeben haben, und ist lokal für map
, sodass Sie keinen direkt erstellen können. Sie müssen entweder auto
verwenden, um den Typ zu schließen oder typeof
die Art zu erhalten:
typeof(map!"a"(x)) y = map!"a"(x);
jedoch nur allgemein typeof
verwenden, wenn Sie eine Variable benötigen, die Sie nicht direkt initialisieren. auto
ist fast immer der Weg zu gehen.
Wenn Sie einen Array aus dem Ergebnis der map
(oder aus einem anderen Bereich) erstellen müssen, dann verwenden std.array.array
:
ulong[] y = array(map!"a"(x));
Wenn Sie nicht wissen viel über Bereiche, dann sollten Sie vielleicht gelesen this. Leider gibt es derzeit keinen Artikel auf dlang.org, in dem Bereiche erklärt werden, aber dieser Link ist für ein Kapitel in einem Buch, das eines der Mitglieder der D-Community auf Türkisch schrieb und ins Englische übersetzt hat, und es deckt Bereiche fair ab Gut.
EDIT:
Walter Bright vor kurzem einen Artikel speziell über Typen geschrieben, die lokal zu einer Funktion sind aber von der Funktion zurückgegeben, die auch Sie aufklären helfen können. Sie bekommen sogar einen coolen Namen: Voldemort Types in D
.
"Sie sollten nicht wissen oder interessieren". Bitte korrigieren Sie mich, wenn ich falsch liege, aber wenn ich nicht wissen/kümmern sollte, dann sollte mein Beispiel kompilieren – dnsmkl
Ich meine, dass Sie nicht wissen oder kümmern sollten, dass alles, was Sie darüber wissen müssen, dass es eine Reihe von ist Das gleiche Genre wie dasjenige, das übergeben wurde. Der genaue Typ ist spezifisch für 'map' und nicht etwas, das du verwenden wirst. Sie verwenden einfach "auto", um den Typ abzuleiten und den Bereich mit der API zu verwenden, die Bereiche haben. Wenn Sie möchten, dass es sich tatsächlich um einen bestimmten Typ handelt, müssen Sie ihn in diesen Typ mit einer Funktion konvertieren, die einen Bereich akzeptiert und den gewünschten Typ generiert (z. B. std.array.array). –
Es scheint unnatürlich, dass ich gezwungen bin, 'auto' zu verwenden, um das Ergebnis der Karte zu verwenden (auch wenn ich laizy eval. Und Zeug mag) Wie auch immer, danke für die Antwort und den Link – dnsmkl