2012-10-08 41 views
0

比方說,我有一個方法(這實際上是一個幫手):如何在數組上映射方法?

def f(x) 
    x + 1 
end 

我想要做的是它在可枚舉的,像這樣映射:

(1..10).map &f 

這顯然不工作提升ArgumentError: wrong number of arguments (0 for 1) 錯誤。我知道我可以像這樣在塊中調用此方法:

(1..10).map {|x| f x } 

但它看起來不像是我的優雅解決方案。還有什麼可以做的呢?

+1

當你使用'(1..10).map(&:f)'時,記住它實際上是調用'1.f','2.f'等等。所以,除非'f'是'Fixnum'的一個方法,否則你嘗試的任何東西都不會工作 –

+0

@CharlesCaldwell這就是爲什麼我在示例中沒有添加「:」來表明'f'是外部定義的方法的原因'Fixnum'類。 – Andrew

回答

4

你可以使用:

所有的
(1..10).map(&method(:f)) 
+0

太棒了!不知道。你能解釋一下嗎? –

+0

不錯的一個!好工作:) –

+2

解釋? 'Object#method'返回一個'Method'對象,它可以像'Proc'一樣被調用。您傳遞給「Method#call」的任何內容都將用作方法調用的參數。 –

2

首先,我沒有看到任何inelegance在這個

(1..10).map {|x| f x } 

通常情況下,你應該使用它。但是,在特殊情況下,可以使用特殊的表單(您需要在對象上調用方法並且該方法不接受參數)。

class Fixnum 
    def f 
    self + 1 
    end 
end 

(1..10).map(&:f) 

在這兩種方法之間,我會選擇第一種方法。

+0

謝謝,我想添加一個類方法,但由於它是輔助方法之一,我認爲最好將它保留在自己的模塊下,而不要損壞其他類。 – Andrew