2016-04-03 9 views
2

を得たが、私は以下を参照してください期待例外ArgumentErrorが、私は以下のクラスの個々のメソッドを呼び出すと、私は<code>ArgumentError</code>を期待していたNoMethodError

class A 
    def with_one_argument(&block) 
    block.call 
    end 
end 

A.new.with_one_argument 
# => NoMethodError: undefined method `call' for nil:NilClass 

しかし、これは期待通りに動作します

class B 
    def with_one_argument(some_value) 
    puts some_value 
    end 
end 

B.new.with_one_argument 
# => ArgumentError: wrong number of arguments (0 for 1) 

誰が説明することができますなぜ(&block)は特別扱いですか?私の理解では、引数にデフォルト値を指定しないと、ArgumentErrorが期待されます。

+1

@sawaを編集してくれてありがとう、それはもっときれいになりました:) – illusionist

答えて

2

何も複雑ではありません。事実は、単にブロックが引数ではないということです。 Aの場合、ブロックを渡すと変換されたprocとしてblockと呼ばれ、そうでない場合はblockの値はnilになります。しかしいずれの場合も、渡されたブロック(引数でもオブジェクトでもない)をproc(オブジェクトである)に変換した結果がblockです。

+0

しかし、 'block'という名前は私に与えられています。私は好きな名前を付けて使用できます。どのように議論ではないのでしょうか? @Sawaの参考リンクをいくつか提供できますか – illusionist

関連する問題