2011-12-12 90 views
0

好時,這可能是真的瘋了,和/或愚蠢的,但..調用函數遍歷散列

我寫的IRCBot也Ruby中學習語言,我想包括命令的調度在機器人。

所以我們可以說,我有一個哈希值,用來定義命令屬於什麼功能:我做

hash = { ".voice" => "basic", ".op" => "basic" } 

然後將此:

hash.each_pair do |k,v| 
case content[0] 
    when k then v(content[1]) 
end 
end 

其中內容[0]是」。聲音「,而內容[1]是有聲的。

這會生成一個錯誤,告訴我v是main:Object的未定義方法。

是我想要做什麼感覺還是有更好的方法來做到這一點?如果這樣做這樣做是有道理的。爲什麼它返回這個錯誤?

+0

我不認爲我明白你正在嘗試做的。你得到的錯誤是因爲'v'是一個字符串。你是否正在設置'v = content [1]'? –

回答

1

假設你有一個字符串的方法,該方法的名稱:

def basic(v) 
    puts v 
end 

method_name = 'basic' 

如果你這樣做:

method_name('Hello') 

你會得到你的錯誤

undefined method `method_name' for main:Object (NoMethodError) 

您必須將字符串變成方法對象才能使用它:

method_object = method(method_name) 
method_object.call('Hello!') 
+1

謝謝!那正是我正在尋找的,現在它工作得很好。 :-) –

+0

接受..我在這裏是新來的,所以看起來我無法贊成,對不起。 –

1

更改...

v(content[1]) 

到...

send(v, content[1])