2011-09-14 3 views
7

は、私はすべてのエラーを起こさないことfoo(&nil)はfoo( "not a proc")とはどのようにふるまいますか?

[1, 2, 3].each(&nil) 

野次るから出た - それはちょうど列挙子を返します。これとは対照的に

[1, 2, 3].each(&"") 

はまた

TypeError: wrong argument type String (expected Proc) 

、block_given &nil原因を発生させますか? NilClassto_procを実装しているため、偽

def block_given_tester 
    if block_given? 
    puts "Block given" 
    else 
    puts "Block not given" 
    end 
end 

block_given_tester(&nil) # => Block not given 

を返すために、そうではありません - 私はRDocとを確認しました。

私は&nilを持っていいだろう、なぜを理解することができますが、私はがどのように行うのわかりません。これはちょうどnilが他のオブジェクトによって共有されない特別な振る舞いを持つ方法の1つですか?

答えて

7

答えはRubyのソースコードを見ると見つかります。

ルビー1.8:ファイルeval.c内の関数block_pass

ルック。特にProcのオブジェクト(マクロNIL_P)からはnilが扱われることに注意してください。関数がゼロの値を渡された場合、空のブロックを評価して返します。オブジェクトがProcオブジェクト(関数rb_obj_is_proc)であるかどうかをチェックした直後のコードでは、 "間違った引数型(予想されるProc)"が例外である場合は発生します。

ルビー1.9.2:ファイルvm_insnhelper.cのメソッドcaller_setup_args

ルック。これは、to_procでprochを変換します.nilでなければ、 のみです。それ以外の場合は、型変換と型チェックがバイパスされます。

+0

1.9ブランチの1つではなく、1.8ブランチの1つを見ているとします。 –

+0

はい、これはRuby 1.8のものです。これは私が利用できるコードです。 Ruby 1.9.2のコードをダウンロードして、何かが変更されているかどうかを確認します。 –

+1

Ruby 1.9.2の回答を編集しました。 –

関連する問題