比方說,我有一個方法(這實際上是一個幫手):如何在數組上映射方法?
def f(x)
x + 1
end
我想要做的是它在可枚舉的,像這樣映射:
(1..10).map &f
這顯然不工作提升ArgumentError: wrong number of arguments (0 for 1)
錯誤。我知道我可以像這樣在塊中調用此方法:
(1..10).map {|x| f x }
但它看起來不像是我的優雅解決方案。還有什麼可以做的呢?
比方說,我有一個方法(這實際上是一個幫手):如何在數組上映射方法?
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..10).map(&method(:f))
太棒了!不知道。你能解釋一下嗎? –
不錯的一個!好工作:) –
解釋? 'Object#method'返回一個'Method'對象,它可以像'Proc'一樣被調用。您傳遞給「Method#call」的任何內容都將用作方法調用的參數。 –
首先,我沒有看到任何inelegance在這個
(1..10).map {|x| f x }
通常情況下,你應該使用它。但是,在特殊情況下,可以使用特殊的表單(您需要在對象上調用方法並且該方法不接受參數)。
class Fixnum
def f
self + 1
end
end
(1..10).map(&:f)
在這兩種方法之間,我會選擇第一種方法。
謝謝,我想添加一個類方法,但由於它是輔助方法之一,我認爲最好將它保留在自己的模塊下,而不要損壞其他類。 – Andrew
當你使用'(1..10).map(&:f)'時,記住它實際上是調用'1.f','2.f'等等。所以,除非'f'是'Fixnum'的一個方法,否則你嘗試的任何東西都不會工作 –
@CharlesCaldwell這就是爲什麼我在示例中沒有添加「:」來表明'f'是外部定義的方法的原因'Fixnum'類。 – Andrew