2015-05-12 35 views
1

我一直在閱讀以不同方式在Ruby中傳遞方法,對我來說傳遞方法並對其執行似乎是最乾淨的。但是,我認爲我做錯了。這工作:如何在Ruby中調用方法作爲參數?

def core 
    myMethod = rand(2) > 0 ? meth1 : meth2 
    myMethod.call("entered val") 
end 

def meth1 
    Proc.new do | val | 
    puts "meth1: #{val}" 
    end 
end 

def meth2 
    Proc.new do | val | 
    puts "meth2: #{val}" 
    end 
end 

但感覺更自然有它看起來像以下(不工作):

def core 
    myMethod = rand(2) > 0 ? meth1 : meth2 
    myMethod("entered val") 
end 

def meth1 
    puts "meth1: #{val}" 
end 

def meth2 
    puts "meth2: #{val}" 
end 

我如何格式化後才能正常運作?

回答

4

你的第二個例子不起作用,因爲你實際上在你的三元運算符中調用meth1meth2core。您可以使用Object#method方法來創建一個Method對象實例。哇。這是很多使用單詞method。示例代碼:

def core 
    myMethod = rand(2) > 0 ? method(:meth1) : method(:meth2) 
    myMethod.call("entered val") 
end 

def meth1(val) 
    puts "meth1: #{val}" 
end 

def meth2(val) 
    puts "meth2: #{val}" 
end 

core 
# => "meth1: entered val" (or "meth2: entered val") 

另一種選擇是使用Object#public_sendObject#send像這樣:

def core 
    myMethod = rand(2) > 0 ? :meth1 : :meth2 
    send(myMethod, "entered val") 
end 

def meth1(val) 
    puts "meth1: #{val}" 
end 

def meth2(val) 
    puts "meth2: #{val}" 
end 

身高:public_send,如果你的方法知名度允許它。

+0

而不是折騰代碼,解釋爲什麼它應該這樣做。然後,OP將能夠了解要做什麼以及爲什麼要做。 –

+0

我認爲對最近提出的問題提供一個快速的,僅用於代碼的答案是有價值的,然後在時間允許的情況下跟隨長時間解釋作爲編輯。當然,你當然不同意。 – Cade

+0

這正是我想要的 - 謝謝! – aronchick

相關問題