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 .

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top