在Ruby中,"收益率超出预期"是什么意思?

时间:2020-03-06 14:34:51  来源:igfitidea点击:

我是Ruby的新手,并且正在尝试以下操作:

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

但我收到"收益率超出预期"错误。我不确定他的意思。顺便说一句,这个问题是我在这里提出的一个更普遍问题的一部分。

解决方案

如果" numOfCuts"是整数,

5.times.foo

是无效的

"时代"期待一个障碍。

5.times{   code here   }

问题是,times方法期望获得一个将对其进行控制的块。但是,我们尚未向其传递任何障碍。有两种方法可以解决此问题。首先是不使用时间:

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

否则将一个块传递给它:

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

我们正在组合似乎没有意义的函数-如果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]

我不确定我们要使用该代码实现什么目标? (而不是专门询问什么似乎是无效的语法)

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

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

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

这是Integer.times和Range的rubydoc。

宾果,我刚发现这是什么。它是一个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.times时,它将返回一个Enumerator,而Jruby则抱怨它需要一个块。