2013-09-04 2 views
14

がここで何が起こっているのかを把握しよう、奇妙なケースを考え出すを見ていない:ブロック構文<p>この</p> <pre><code>(p test) do 1 end </code></pre><p>としてブロックは、<code>p test</code>のない結果に渡され<code>test</code> 。そのため、<code>yield</code>はそのエラーを発生させずに返します。</p>

> 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

ここは答えです... http://stackoverflow.com/questions/533008/what-is-the-difference-or-value-of-these-block-coding-styles-in-ruby/533040# 533040 –

+0

ここに答えがあります - http://stackoverflow.com/questions/2122380/using-do-block-vs-brackets?lq=1 –

+1

これは、Rubyを選択できるとしても、かっこを使用する理由です。 – Linuxios

答えて

16

パーサはこの

p test do 
    1 
end 
を認識します。違いは、「何のブロック与えられた(収率)LocalJumpError」が発生
11

doおよび{}は、方法に付随するブロックが完全に交換可能でないことを示す。

p test do 
    1 
end 

優先順位があなたと悩んでいます。これは実際にはこれです:

p(test()) do 
    1 
end 

ので、ブロックはp、ないtestに渡さなっています。

{}は、doよりも高い優先順位を持ち、より密接に構文的に近い方法にバインドします。これは、and/&&or/||のような象徴的な等価を持つ他のルビキーワードにも当てはまります。

関連する問題

 関連する問題