2013-09-04 7 views
14

einen seltsamen Fall kommen sah, um herauszufinden, was hier geschieht:Block Syntax Unterschied verursacht "LocalJumpError: kein Block gegeben (Ausbeute)"

> def test 
> p yield 
> end 
=> nil 
> test { 1 } 
1 
=> 1 
> p test { 1 } 
1 
1 
=> 1 
> p test do 
> 1 
> end 
LocalJumpError: no block given (yield) 
+0

ist die Antwort ... http://stackoverflow.com/questions/533008/what-is-the-difference-or-value-of-these-block-coding-styles-in-ruby/533040# 533.040 –

+0

hier ist die Antwort - http://stackoverflow.com/questions/2122380/using-do-block-vs-brackets?lq=1 –

+1

diesem Grund sollten Sie Klammern verwenden, obwohl Rubin können Sie wählen. – Linuxios

Antwort

16

Der Parser erkennt diesen

p test do 
    1 
end 

wie diese

(p test) do 
    1 
end 

der Block übergeben wird von p test führt, nicht test . Daher kann yield nicht liefern und erhöht diesen Fehler.

11

do und {} zu bezeichnen Blöcke an Methoden sind nicht vollständig austauschbar.

p test do 
    1 
end 

Präzedenz mit Ihnen schraubt. Dies ist eigentlich diese:

p(test()) do 
    1 
end 

So ist der Block p geben wird immer, nicht test.

{} hat höhere Priorität als do und bindet so enger an die syntaktisch näher Methode. Dies gilt auch für andere Ruby-Schlüsselwörter, die symbolische Äquivalente haben, wie and/&& und or/||, weshalb werden die Symbole in der Regel über die Worte zu empfehlen. Hier

Verwandte Themen