30 Stimmen

Syntax für das Einfügen eines Blocks in eine einzige Zeile

Ich habe also eine Ruby-Methode wie diese:

def something(variable, &block)
  ....
end

Und ich möchte es so nennen:

something 'hello' { do_it }

Nur funktioniert das bei mir nicht, ich erhalte einen Syntaxfehler. Wenn ich stattdessen dies tue, funktioniert es:

something 'hello' do
  do_it
end

Nur vermisse ich da irgendwie den schönen Anblick, wenn es in einer Zeile steht.

Ich kann sehen, warum dies geschieht, wie es aussehen könnte, wie es ist ein Hash als eine zweite Variable übergeben, aber ohne ein Komma zwischen den Variablen ... aber ich nehme an, dass es eine Möglichkeit, dies zu behandeln, die ich vermisse sein muss. Gibt es das?

46voto

Rômulo Ceccon Punkte 9771

Sie müssen Ihr Argument in Klammern setzen:

something('hello') { do_it }

Das sollte funktionieren.

0 Stimmen

Ja, das war's!! Danke. Manchmal sind es die offensichtlichsten Dinge, die man übersieht ;-)

0 Stimmen

@Cameron Booth: Vielleicht kannst du seine Antwort akzeptieren :)

0 Stimmen

Wenn Sie keine Parameter haben, kann ich mir vorstellen, dass Sie immer noch die explizite Klammer setzen müssen, sonst wird der Block als Parameter übergeben? dh: something() { do_it }

2voto

seanbehan Punkte 1285

Wenn Sie wollen, dass "def something" einen Block annimmt, müssen Sie Daten an diesen Block übergeben. Zum Beispiel:

#to uppercase string
def something(my_input)
 yield my_input.upcase
end

# => "HELLO WORLD"
something("hello world") { |i| puts i}

0 Stimmen

Das ist nicht unbedingt richtig. Sie können nichts zurückgeben, den Block an eine andere Methode weitergeben oder ihn ignorieren. Es besteht keine besondere Notwendigkeit, etwas an den Block zu übergeben. So wie die Methode in der ursprünglichen Frage geschrieben wurde, wird der Block passwd in eine Proc namens block .

0voto

Ryan Bigg Punkte 104835

Äh, was ist mit:

>> def something(arg1 , &block)
>>   yield block
>> end
=> nil
>> def do_it
>>   puts "Doing it!"
>> end
=> nil
>> something('hello') { do_it }
"Doing it!"
=> nil

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