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 社区的一位成员用土耳其语写的一本书中的一章,并一直在翻译成英文,它相当覆盖范围好。

编辑

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;

如果您使用 dmd 2.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()无法命名的内部类型,因为它是Voldemort Type

Phobos 中的实际源代码如下所示:

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

如果您研究源代码,您会注意到它Result只是一个范围:它具有通常的popFront()empty()方法,以及取决于需要返回的范围类型的其他方法。如果你使用类型推断,

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

r将输入为Result,但您不能直接实例化它。

于 2012-05-09T16:48:31.360 回答