2011-07-16 9 views
2
def double(a) 
a*2 
end 

method_object = method(:double) 

、ここでは、このコードをどうするか私の質問です:Array#mapはどのようにこのようなことをするパラメータを持っていますか?

[1,3,5,6].map(&method_object) 

はRubyのドキュメント内の

[1,3,5,6].map {|x| method_object.call(x)} 

の同じ結果を達成するため、アレイ#マップは正常ではない、ブロックを持つことができますパラメータ

ary.collect {|item| block } → new_ary ary.map {|item| block } → new_ary ary.collect → an_enumerator ary.map → an_enumerator 

答えて

3

簡単に言えば、アンパサンド&が使用されます。メソッドオブジェクトをブロックに「パック/アンパック」するので、ブロックを通過した場合と同じように効果が少なくなります。

次の方法で、あなたのメソッドに渡されたブロック「を得る」ことができます。これは、パラメータとして&fooを宣言yieldを呼び出していないようになります

def method_with_block(&foo) 
    # do something here 
    foo.call 
    # do something else 
end 

を。私はバインディングが2つのアプローチで異なるかもしれないと考えていますが、ほとんどの場合、その効果はあなたが期待するものです(私が間違っている場合は修正してください)。

もちろん、アンパサンドは別の方法で動作します。メソッドがブロックを予期し、procオブジェクトを持っている場合は、書いたとおりに、単に&をプリペンドすることができます。具体的には、&渡されたオブジェクト(レールのto_proc方法がdescribed in this entry about to_procと同様の方法でこれを使用して呼び出します。

私はこれがあなたの疑問のいくつかに答えることを願っています。場合は、私が書いたもので間違いがあると、感じ。それを修正するために自由

リーディングあなたが役に立つかもしれません:

0

を示しています

class Integer 
    def double 
    self*2 
    end 
end 

[1,2,3,4].map(&:double) 
[ 
    [0] 2, 
    [1] 4, 
    [2] 6, 
    [3] 8 
] 
関連する問題