谁能说一下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从这一点上,我不清楚我能做什么,不能做什么。
发布于 2012-05-04 04:35:16
你不应该知道或关心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));如果您对范围了解不多,那么您可能应该阅读this。不幸的是,目前还没有一篇关于dlang.org解释范围的文章,但这个链接是D社区的一位成员用土耳其语写的书中的一个章节,并且已经被翻译成英语,它涵盖了范围的相当好。
编辑
沃尔特·布赖特最近专门写了一篇关于类型的文章,这篇文章专门讨论了函数的本地类型,但函数返回了类型,这也可能对您有所帮助。他们甚至有一个很酷的名字:Voldemort Types in D。
发布于 2012-05-04 04:30:12
结果范围是“lazy”,它不代表最终结果。
如果您导入std.array并按如下方式包装它,则可以将其转换为数组:
ulong[] y = array(std.algorithm.map!"a"(x));或
ulong[] y = std.algorithm.map!"a"(x).array;如果您使用的是dmd 2.059或更高版本
也可以使用foreach直接迭代map结果:
auto result = std.algorithm.map!"a"(x);
foreach (element; result)
writeln(to!string(element));发布于 2012-05-10 00:48:31
Result是map()中的一种类型,由于它是Voldemort Type,因此无法命名。
Phobos中的实际source code如下所示:
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,但您不能直接实例化它。
https://stackoverflow.com/questions/10437448
复制相似问题