3

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

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

但我得到了“块外调用的产量”错误。我不确定他的意思。顺便说一句,这个问题是我在这里问的一个更一般的问题的一部分。

4

5 回答 5

9

问题在于,times 方法期望得到一个块,它将让出控制权。但是,您还没有向它传递一个块。有两种方法可以解决这个问题。首先是不使用时间:

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

或者传递一个块给它:

mySet = []
numOfCuts.times {mySet.push( rand(seqLength) )}
于 2008-09-23T05:06:35.053 回答
1

如果“numOfCuts”是一个整数,

5.times.foo   

是无效的

“times”需要一个块。

5.times{   code here   } 
于 2008-09-23T05:03:55.603 回答
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]

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

于 2008-09-23T05:10:07.710 回答
1

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

核磁共振下

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

于 2008-09-23T13:01:17.063 回答
0

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

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

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

这是Integer.timesRange的 ruby​​doc 。

于 2008-09-23T05:11:50.857 回答