Ruby中的'yield called out of block'是什么意思?

3

我是Ruby的新手,我正在尝试以下内容:

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

但我遇到了“从块中调用yield”的错误。我不确定这是什么意思。顺便说一下,这个问题是我在这里提出的一个更普遍的问题。


你是使用JRuby还是MRI Ruby? - Sam Saffron
5个回答

9
问题在于times方法期望得到一个块,以便将控制权传递给它。然而,你没有将块传递给它。有两种解决方法。第一种是不使用times方法:
mySet = (1..numOfCuts).map{ rand(seqLength) }

否则,将其传递给一个块:
mySet = []
numOfCuts.times {mySet.push( rand(seqLength) )}

你需要在 numOfCuts 后面加上一个 ),这样就可以有重复了 :) - Kent Fredric
哎呀,问题解决了。我只是想修复API错误,而不是逻辑错误。 - user11318
在Ruby中,什么是块? - Esteban Araya
我认为我无法给出比http://www.rubycentral.com/book/tut_containers.html(这是《Programming Ruby》的一章)中更好的关于块的解释。 - user11318

1

如果 "numOfCuts" 是一个整数,

5.times.foo   

无效

“times”需要一个块。

5.times{   code here   } 

1

您正在组合看起来没有意义的函数 - 如果 numOfCuts 是一个整数,那么只需使用 times 和一个块将运行该块那么多次(尽管它仅返回原始整数):

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]

我不确定你想用这段代码实现什么 - 你想做什么?(而不是专门询问似乎无效的语法)

1

太好了,我刚刚找到了这是什么。这是一个JRuby的bug。

在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.times时,它会返回一个枚举器,而Jruby则抱怨需要一个块。


0

Integer.times 需要一个块。错误信息意味着 times 方法内的 yield 语句无法被调用,因为您没有给它一个块。

至于您的代码,我认为您正在寻找一个范围:

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

这里是Integer.timesRange的Ruby文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接