Ruby:使用哈希来访问实例方法

时间:2013-09-21 18:19:07

标签: ruby hash instance

我正在研究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]行之前执行。

我在这里做错了什么?

2 个答案:

答案 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)

在创建散列时,将评估所有方法。我建议您阅读有关sendhttp://www.ruby-doc.org/core-2.0.0/Object.html#method-i-send)方法的使用情况。如果您使用send,您将以以下内容结束:

def dispatch(command, pet)
  pet.send(command)
end

请注意,您需要调整方法putToBed的名称。