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

method_object = method(:double) 

,這裏是我的問題,請問這是怎麼代碼:Array#map有參數如何做這樣的事情?

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

實現

[1,3,5,6].map {|x| method_object.call(x)} 
Ruby的文檔中

相同的結果,陣列#地圖只能有塊,不正常參數

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

回答

3

簡而言之,使用與符號&將一個方法對象「打包」或「解包」到一個塊中,所以效果與通過塊的效果相差無幾。

可以「搞定」已被傳遞給你的方法塊:

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

這將類似於調用yield,而不是宣佈&foo作爲參數。我認爲這兩種方法的綁定可能不同,但在大多數情況下,效果是您所期望的(如果我錯了,請更正)。

當然,符號周圍工作的其他方式 - 如果一個方法需要一個塊,你有一個進程內對象,你可以簡單地用&預置它,就像你寫的。更精確地說,&調用傳遞的對象(鋼軌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 
] 
相關問題