在Ruby中,“块出来的收益”是什么意思?

时间:2008-09-23 04:56:07

标签: ruby functional-programming

我是Ruby的新手,我正在尝试以下方法:

mySet = numOfCuts.times.map{ rand(seqLength) }

但是我得到了“收益率被阻止”错误。我不确定他的意思。顺便说一句,这个问题是我提出的一个更普遍的问题的一部分here

5 个答案:

答案 0 :(得分:9)

问题是,times方法期望获得一个它将产生控制权的块。但是你还没有传递一个块。有两种方法可以解决这个问题。首先是不使用时间:

mySet = (1..numOfCuts).map{ rand(seqLength) }

或者传递一个块:

mySet = []
numOfCuts.times {mySet.push( rand(seqLength) )}

答案 1 :(得分:1)

如果“numOfCuts”是一个整数,

5.times.foo   

无效

“时代”需要一个块。

5.times{   code here   } 

答案 2 :(得分:1)

你正在组合似乎没有意义的函数 - 如果numOfCuts是一个整数,那么只使用次数和一个块将多次运行该块(尽管它只返回原始整数:

irb(main):089:0> 2.times {|x| puts x}
0
1
2

map是一个适用于范围和数组并返回数组的函数:

irb(main):092:0> (1..3).map { |x| puts x; x+1 }
1
2
3
[2, 3, 4]

我不确定你要用代码实现什么 - 你想做什么? (而不是具体询问看似无效的语法)

答案 3 :(得分:1)

宾果,我刚刚发现了这是什么。它是一个JRuby错误。

在MRI下

>> 3.times.map
=> [0, 1, 2]
>> 

在JRuby下

irb(main):001:0> 3.times.map
LocalJumpError: yield called out of block
    from (irb):2:in `times'
    from (irb):2:in `signal_status'
irb(main):002:0> 

现在,我不知道MRI(标准的Ruby实现)是否在这里做正确的事情。它可能应该抱怨这没有意义,但是当在MRI中调用n次时它返回一个枚举器,而Jruby则抱怨它需要一个块。

答案 4 :(得分:0)

Integer.times需要一个块。错误消息表示yield方法中的times语句无法调用,因为您没有给它一个块。

至于你的代码,我认为你所寻找的是一个范围:

(1..5).map{ do something }

这是Integer.timesRange的rubydoc。