在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则抱怨它需要一个块。