【发布时间】:2012-01-03 21:19:34
【问题描述】:
我写了以下代码:
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 哈希成为类变量,并且仍然能够访问特定的对象实例变量?
【问题讨论】:
-
只是好奇为什么不将方法
add、remove和other定义为实例方法并使用respond_to?和send来调用它们? -
为什么要
@commands成为类变量? -
@Victor:一个很好的理由是它使访问控制更容易。如果您使用
send和方法,则需要单独列出允许使用run_command的方法,使用哈希将可用命令及其实现收集到一个漂亮的整洁包中。 -
@mu 你就不能问
respond_to?(cmd)吗?也就是说,为什么要单独列出允许的命令? -
@mu
send(cmd) if @allowed_methods.include?(cmd),如果您需要访问实例变量,它仍然比使用 lambda 哈希更干净。
标签: ruby oop proc-object