2016-08-10 4 views
0

Ich bin (sehr) neu in Ruby. Ich habe eine interessante Möglichkeit gefunden, eine Funktion aufzurufen, aber ich kann nicht herausfinden, wie sie wirklich funktioniert.Ruby Funktionsaufruf: foo "bar" do

def foo (arg1) 
    puts arg1 
end 

foo "bar" do 
    "hello" 
    puts "world" 
    thisStuff 
end 

Könnte jemand mir bitte erklären, was hier geschieht? Es gibt keine Funktion namens "thisStuff", aber der Code kompiliert ohne Probleme und das Konsolenergebnis ist "bar".

+4

Das 'do' ...' end' ist ein * Block *, im Wesentlichen eine anonyme Funktion, die an 'foo' übergeben wird. Es kann innerhalb der 'foo'-Funktion mit' yield' ausgeführt werden, aber 'yield' wird nie aufgerufen, so dass der Block nie ausgeführt wird. –

+0

Vielen Dank, es ist genau das, was ich gesucht habe. Könnten Sie Ihren Kommentar zu einer offiziellen Antwort machen, also könnte ich es als Lösung festlegen und diese Frage schließen? – everyonecancode

+0

Ihre Frage ist unklar. Ruby hat keine Funktionen. Es gibt mindestens drei verschiedene Dinge in dem von Ihnen geposteten Code-Snippet, die man möglicherweise als "Funktion" bezeichnen könnte, obwohl in Ruby keines davon so genannt wird. Von wem sprichst du? –

Antwort

2

Die do ... end ist ein Block , im Wesentlichen eine anonyme Funktion, zu foo geben. Es kann innerhalb der foo-Funktion unter Verwendung von yield ausgeführt werden, aber yield wird nie aufgerufen, so dass der Block nie ausgeführt wird.

Sie können auch diese Blöcke sehen deklariert eine {} Syntax, die die gleiche wie do bedeutet ... end. Sie werden hauptsächlich in funktionalen Programmierfunktionen wie map oder select verwendet.

2

Ruby Block ist ein Code, den Sie um do - end Schlüsselwörter setzen!

Blöcke hat Ausbeute Schlüsselwort, um Code auszuführen. Werfen Sie einen Blick auf diese (Quelle: http://mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutes):

enter image description here

in Ihrem Fall Ihr Block foo nicht haben eine yield und daher, wenn nannte es nur den Teil in der block.Try ausgeführt Hinzufügen einer Ausbeute und Sie erhalten die Ausnahme wie erwartet.

Überprüfen Sie den obigen Link, um weitere Blöcke zu erkunden, da sie eines der leistungsstarken Ruby-Tools sind.

+0

Vielen Dank (vor allem für einen Link), aber OrangeFlash81 war zuerst meine Frage zu beantworten. Deshalb gab ich ihm den "Antwort" Status, obwohl dieser mehr Fleisch hat :). – everyonecancode

+0

@everyonecancode kein Problem Kumpel :), froh zu helfen – Nimir

Verwandte Themen