O que significa 'rendimento chamado fora do bloco' significa em Ruby?
-
02-07-2019 - |
Pergunta
Eu sou novo para Ruby, e eu estou tentando o seguinte:
mySet = numOfCuts.times.map{ rand(seqLength) }
mas tenho a 'rendimento chamado fora do bloco' erro. Eu não tenho certeza do que seus meios. BTW, esta questão faz parte de uma questão mais geral Perguntei aqui .
Solução
O problema é que o método vezes espera obter um bloco que vai ceder o controle de. No entanto, você não passaram de um bloco a ele. Há duas maneiras de resolver isso. A primeira é não usar vezes:
mySet = (1..numOfCuts).map{ rand(seqLength) }
ou então passar um bloco a ele:
mySet = []
numOfCuts.times {mySet.push( rand(seqLength) )}
Outras dicas
Se "numOfCuts" é um inteiro,
5.times.foo
é inválido
"vezes" espera um bloco.
5.times{ code here }
Você está combinando funções que não parecem fazer sentido - se numOfCuts é um inteiro, então apenas usando vezes e um bloco irá executar o bloco que muitas vezes (embora ele só retorna o inteiro original:
irb(main):089:0> 2.times {|x| puts x}
0
1
2
mapa é uma função que funciona em gamas e matrizes e retorna uma matriz:
irb(main):092:0> (1..3).map { |x| puts x; x+1 }
1
2
3
[2, 3, 4]
Eu não sei o que você está tentando alcançar com o código - o que você está tentando fazer? (Em oposição a pedir especificamente sobre o que parece ser uma sintaxe inválida)
Bingo, eu só descobri o que é isso. É um bug JRuby.
De acordo com MRI
>> 3.times.map
=> [0, 1, 2]
>>
De acordo com 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>
Agora, eu não sei se MRI (a implementação padrão do Ruby) está fazendo a coisa certa aqui. Provavelmente deve queixar-se de que isso não faz sentido, mas quando n.times é chamado em MRI ele retorna um enumerador, enquanto JRuby reclama que ele precisa de um bloco.
Integer.times espera um bloco. A mensagem de erro significa que a declaração yield
dentro do método times
não pode ser chamado porque não dar-lhe um bloco.
Quanto ao seu código, eu acho que o que você está procurando é um intervalo:
(1..5).map{ do something }
Aqui está o teu rubydoc para o Integer.times e Faixa .