我寫了下面的代碼:如何使用類變量中定義的lambda/Proc中的實例變量?
class Actions
def initialize
@people = []
@commands = {
"ADD" => ->(name){@people << name },
"REMOVE" => ->(n=0){ puts "Goodbye" },
"OTHER" => ->(n=0){puts "Do Nothing" }
}
end
def run_command(cmd,*param)
@commands[cmd].call param if @commands.key?(cmd)
end
def people
@people
end
end
act = Actions.new
act.run_command('ADD','joe')
act.run_command('ADD','jack')
puts act.people
然而這工作,當@commands
哈希是一個類變量,哈希裏面的代碼不知道@people
陣列。
如何使@commands
散列成爲類變量並仍然能夠訪問特定的對象實例變量?
只是好奇爲什麼不定義方法'添加',''刪除'和'其他'作爲實例方法,並使用'respond_to?'和'發送'來調用它們? – 2012-01-03 21:42:55
爲什麼你要'@ commands'成爲一個類變量? – 2012-01-03 22:00:58
@Victor:一個很好的理由是它使得訪問控制更容易。如果你使用'send'和方法,你需要一個允許使用'run_command'的方法的單獨列表,使用Hash將可用的命令及其實現收集到一個漂亮的包中。 – 2012-01-03 22:09:41