2008-09-23 10 views
3

Je suis nouveau à Ruby, et je suis en train de ce qui suit:Qu'est-ce que 'yield appelé hors bloc' signifie dans Ruby?

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

mais j'obtenir le « rendement appelé hors du bloc » erreur. Je ne suis pas sûr de ce que ses moyens. BTW, cette question fait partie d'une question plus générale, j'ai demandé here.

+0

utilisez-vous jruby ou mri ruby? –

Répondre

9

Le problème est que la méthode times s'attend à obtenir un bloc auquel elle donnera le contrôle. Cependant vous ne lui avez pas passé un bloc. Il y a deux façons de résoudre cela. La première est de ne pas utiliser les temps:

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

ou bien passer un bloc à elle:

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

vous voulez a) après numOfCuts là :) (et qui aura des doublons) –

+0

Oups, corrigé. Et j'essayais juste de réparer l'erreur de l'API, pas l'erreur de logique. – user11318

+0

Qu'est-ce qu'un bloc dans Ruby? –

1

si "numOfCuts" est un entier,

5.times.foo 

est invalide

"fois" attend un bloc.

5.times{ code here } 
1

Vous combinez les fonctions qui ne semblent pas donner un sens - si numOfCuts est un entier , puis juste en utilisant des temps et un bloc courra le bloc plusieurs fois (si elle ne retourne que le nombre entier d'origine:

irb(main):089:0> 2.times {|x| puts x} 
0 
1 
2 
carte

est une fonction qui fonctionne sur des gammes et des tableaux et retourne un tableau:

irb(main):092:0> (1..3).map { |x| puts x; x+1 } 
1 
2 
3 
[2, 3, 4] 

Je ne suis pas sûr de ce que vous essayez d'obtenir avec le code - qu'essayez-vous de faire? (au lieu de demander spécifiquement ce qui semble être une syntaxe invalide)

0

Integer.times attend un bloc. Le message d'erreur signifie que l'instruction yield dans la méthode times ne peut pas être appelée car vous ne lui avez pas donné de bloc.

En ce qui concerne votre code, je pense que ce que vous cherchez est une gamme:

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

Voici ton rubydoc pour le Integer.times et Range.

1

Bingo, je viens de découvrir ce que c'est. C'est un bug JRuby.

Sous IRM

>> 3.times.map 
=> [0, 1, 2] 
>> 

Sous 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> 

Maintenant, je ne sais pas si l'IRM (la norme de mise en œuvre Ruby) est en train de faire la bonne chose ici. Il devrait probablement se plaindre que cela n'a pas de sens, mais quand N est appelé en IRM, il retourne un énumérateur, tandis que Jruby se plaint qu'il a besoin d'un bloc.