我想调用函数f
5次(例如)并获取结果列表。现在我有这个:
(1..5).to_a.map!{f}
注意:现在f
是一个不接受任何输入并返回true
或false
的函数。因此,当运行完毕后,我会得到5个true
/ false
值的列表。
有没有更好的方法来使用其他内置函数(可能reduce
?)我有这个想法,但无法弄清楚如何使用它...)
答案 0 :(得分:34)
5.times.collect { f }
(假设没有参数。map
是collect
的别名;在实际收集时我更喜欢名称collect
,因为它似乎更具沟通性,但是YMMV。)
我也更喜欢较长5.times
而不是(1..5)
。这似乎也更具沟通性:我不是真的"迭代一个范围",我做了五次"。
IMO答案在这种情况下有点违反直觉,因为我没有真正运行collect
五次,但是collect.5.times { f }
不起作用,所以我们玩了一下无论如何,这是一场心理游戏。
答案 1 :(得分:5)
如果您想要基于零的增加参数,请尝试使用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]
答案 2 :(得分:1)
Array.new(10) { f }
如果需要,索引值可用:
Array.new(10) { |i| f(i) }
[使用块],创建给定大小的数组。通过将元素的索引传递给给定块并存储返回值来创建此数组中的每个元素。
自at least 1.8.7以来,这已经成为可能。
答案 3 :(得分:0)
你可以通过不放to_a
来缩短你的代码......(1..5)是一个可枚举的,所以它适用于map。
(1..5).map!{f}