1

我正在解决 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]行之前。

我在这里做错了什么?

4

2 回答 2

3

是的,这是正确的行为。

{'feed'       => pet.feed}

上面这行的意思是“调用方法pet.feed并使用它的返回值分配给键'feed'”。您必须使用 lambdas(或类似的)来创建以后可以调用的代码块。像这样的东西:

def dispatch(command, pet)
  dispatches = {'feed'       => proc { pet.feed },
                'put to bed' => proc { pet.put_to_bed }}
  dispatches[command].call
end
于 2013-09-21T18:22:33.743 回答
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

于 2013-09-21T18:23:29.897 回答