我写了下面的代码:如何使用类变量中定义的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