我正在研究Chris Pine的 Learn to Program 一书中的一个问题。我已经使用一些实例方法定义了一个类Pet
。在类定义之外,我正在尝试构建一个方法,该方法将接受一个字符串和Pet
类的实例并运行相应的实例方法。
def dispatch(command, pet)
dispatches = {'feed' => pet.feed,
'walk' => pet.walk,
'put to bed' => pet.putToBed,
'rock' => pet.rock,
'toss' => pet.toss}
dispatches[command]
end
然而,当dispatch
方法运行时,它会执行散列中出现的所有实例方法,而不仅仅是command
对应的实例方法。它们按照它们在代码中出现的顺序执行,甚至在到达dispatches[command]
行之前执行。
我在这里做错了什么?
答案 0 :(得分:3)
是的,这是正确的行为。
{'feed' => pet.feed}
上面一行表示“调用方法pet.feed
并使用其返回值分配给键'feed'”。您必须使用lambda(或类似)来创建可以在以后调用的代码块。像这样:
def dispatch(command, pet)
dispatches = {'feed' => proc { pet.feed },
'put to bed' => proc { pet.put_to_bed }}
dispatches[command].call
end
答案 1 :(得分:1)
在创建散列时,将评估所有方法。我建议您阅读有关send
(http://www.ruby-doc.org/core-2.0.0/Object.html#method-i-send)方法的使用情况。如果您使用send
,您将以以下内容结束:
def dispatch(command, pet)
pet.send(command)
end
请注意,您需要调整方法putToBed
的名称。