3 Stimmen

Was bedeutet "yield called out of block" in Ruby?

Ich bin neu in Ruby, und ich versuche das folgende:

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

aber ich erhalte den Fehler "yield called out of block". Ich bin mir nicht sicher, was er bedeutet. BTW, diese Frage ist Teil einer allgemeineren Frage, die ich gestellt habe aquí .

0 Stimmen

Verwenden Sie jruby oder mri ruby?

9voto

user11318 Punkte 9115

Das Problem ist, dass die Methode times einen Block erwartet, dem sie die Kontrolle übergibt. Sie haben der Methode jedoch keinen Block übergeben. Es gibt zwei Möglichkeiten, dieses Problem zu lösen. Die erste ist, times nicht zu verwenden:

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

oder einen Block an ihn übergeben:

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

0 Stimmen

Sie wollen ein ) nach numOfCuts dort :) ( und das wird Duplikate haben )

0 Stimmen

Ups, korrigiert. Und ich habe nur versucht, den API-Fehler zu beheben, nicht den Logikfehler.

0 Stimmen

Was genau ist ein Block in Ruby?

1voto

Kent Fredric Punkte 55042

Wenn "numOfCuts" eine ganze Zahl ist,

5.times.foo   

ist ungültig

"times" erwartet einen Block.

5.times{   code here   }

1voto

Kyle Burton Punkte 25900

Sie kombinieren Funktionen, die nicht sinnvoll zu sein scheinen - wenn numOfCuts eine ganze Zahl ist, dann nur mit Zeiten und ein Block wird der Block so viele Male ausgeführt (obwohl es nur die ursprüngliche ganze Zahl zurückgibt:

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

map ist eine Funktion, die mit Bereichen und Arrays arbeitet und ein Array zurückgibt:

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

Ich bin mir nicht sicher, was Sie mit dem Code erreichen wollen - was versuchen Sie zu tun? (im Gegensatz zu der Frage nach der scheinbar ungültigen Syntax)

1voto

Sam Saffron Punkte 124121

Bingo, ich habe gerade herausgefunden, was das ist. Es ist ein JRuby-Bug.

Unter MRI

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

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

Ich weiß nicht, ob MRI (die Standard-Implementierung von Ruby) hier das Richtige tut. Es sollte sich wahrscheinlich beschweren, dass dies keinen Sinn macht, aber wenn n.times in MRI aufgerufen wird, gibt es einen Enumerator zurück, während Jruby sich beschwert, dass es einen Block braucht.

0voto

jop Punkte 80065

Integer.times erwartet einen Block. Die Fehlermeldung bedeutet, dass die yield Anweisung innerhalb der times Methode kann nicht aufgerufen werden, weil Sie ihr keinen Block gegeben haben.

Was Ihren Code betrifft, so denke ich, dass Sie nach einem Bereich suchen:

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

Hier ist die rubydoc für die Ganzzahl.mal y Bereich .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X