2009-09-14 35 views
16

我想在Ruby中的數組中存儲幾種不同的方法。假設我要存放type方法兩次:ruby​​中的方法指針

[type, type] 

type兩個條目不存儲在陣列中;它執行兩次type,並將結果存儲在數組中。我如何明確地引用方法對象本身?

(這只是一個簡單的我真正想要的版本。)

編輯:在第二個想法,它困擾我下面提出的解決方案通過將方法的名稱避免了這個問題。你如何傳遞方法對象本身?例如,如果將[:type,:type]傳遞給具有替代類型分辨率的方法,該怎麼辦?你怎麼能通過類型方法對象本身?

回答

31

如果你想存儲的方法,而不是調用你發送調用方法或只是消息的結果它,你需要在擁有的對象上使用method方法。因此,例如

"hello".method(:+) 

將返回對象「你好」的方法+,所以如果你的說法「世界」稱呼它,你會得到的「Hello World」。

helloplus = "hello".method(:+) 
helloplus.call " world" # => "hello world" 
+0

[方法(:類型),方法(:類型)] – jrhicks 2009-09-14 02:58:44

+0

@jrhicks:只有當方法屬於自己。 – Chuck 2009-09-14 03:06:17

+0

首先SO紅寶石徽章 - 恭喜! – 2009-09-14 08:13:48

1
[:type, :type].collect { |method_name| self.send(method_name) } 

另外,如果該方法是一個對象的一部分:

method = obj.method(:type) 
values = [method.call, method.call] 
+0

這似乎不適用於我 - 它只是導致'[Object,Object]'。 – Peter 2009-09-14 01:50:07

+0

答案的第一部分基本上是從irb複製粘貼的,所以我認爲簡化你的情況正在搞砸它。 – 2009-09-14 01:52:14

+0

看起來很對我。 Object的類型是Object ...您可能需要'self.send(method_name)',因此它將方法應用於對象而不是全局Object對象。 – 2009-09-14 01:53:36

11

如果你在考慮在Ruby中做方法引用,那麼你做錯了。

Ruby中有一種內置方法,名爲method。它將返回該方法的proc版本。不過,這不是對原始方法的參考。每撥打method都會創建一個新的proc。例如,更改方法不會影響proc。

def my_method 
    puts "foo" 
end 

copy = method(:my_method) 

# Redefining 
def my_method 
    puts "bar" 
end 

copy.call 
# => foo 

當你想存儲代碼片段,並且不想使用常規方法時,請使用procs。

stack = [proc { do_this }, proc { do_that }] 
stack.each {|s| s.call } 
+0

正如我在評論中對我的回答所說的,這正是它應該如何工作的。你不「改變方法」,你替換方法。很顯然,對舊方法的引用仍然會引用舊方法,就像給舊實例變量引用一樣,即使給實例變量一個新值,它仍然會引用舊方法。如果您想要動態調度而不是存儲特定的方法,則需要改爲發送消息。 – Chuck 2009-09-14 15:25:30