2012-01-09 33 views
6

我想调用函数f 5次(例如)并获得结果列表。现在,我有这样的:多次调用函数并获得结果列表

(1..5).to_a.map!{f} 

注:眼下f是一个函数,没有输入和返回truefalse。所以当这个运行完成时,我会得到一个5 true/false值的列表。

是否有更好的方法来做到这一点使用其他内置函数(可能reduce?我有这样的想法,但无法弄清楚如何使用它...)

回答

31
5.times.collect { f } 

(假设没有参数。map是它的别名collect;我更喜欢的名字collect实际上收集时,它似乎更善于沟通,但情况因人而异)

我也比较喜欢长5.times而不是(1..5)。这也似乎更具沟通性:我并不是真的“在一个范围内迭代”,而是“做五次事情”。

IMO在这种情况下的答案有点违反直觉,因为我没有真正运行collect五次,但collect.5.times { f }不起作用,所以我们无论如何都要玩一些心理游戏。

+0

哇......我怎么错过了!感谢@Dave Newton,正是我在寻找的。 – trh178 2012-01-09 19:22:51

3

尝试Array构造的块的形式,如果你想从零开始增加参数:

Array.new(5) {|x| (x+1).to_f} # => [1.0, 2.0, 3.0, 4.0, 5.0] 
Array.new(10) { rand } # => [0.794129655156092, ..., 0.794129655156092] 
0

你可以只通过缩短不把to_a你的代码...(1..5)是一个枚举如此它适用于地图。

(1..5).map!{f}

1

使用Array.new与块

Array.new(10) { f } 

如果你想索引值可用它:

Array.new(10) { |i| f(i) } 

From the docs

[附AB锁定],创建给定大小的数组。该数组中的每个元素都是通过将元素的索引传递给给定的块并存储返回值来创建的。

at least 1.8.7以来这已成为可能。