method_missing在instance_eval中

时间:2009-12-16 21:06:09

标签: ruby

完整代码:http://friendpaste.com/5TdtGPZaEK0DbDBa2DCUyB

class Options
    def method_missing(method, *args, &block)
        p method
    end
end

options = Options.new

options.instance_eval do
    foo
    foo = "It aint easy being cheesy!"
end

puts "#===---"
options.foo
options.foo = "It still aint easy being cheesy!"

返回:

:foo
#===---
:foo
:foo=

因为它将foo = ""视为instance_eval中的局部变量,所以它不会将其识别为方法。

我如何让instance_eval将其视为一种方法?

2 个答案:

答案 0 :(得分:5)

表达式foo = ""永远不会是方法调用。这是一个局部变量赋值。这是Ruby语法的一个事实。要调用setter,必须明确指定接收器。这就是为什么大多数Ruby伪DSL使用Dwemthy风格的原因:

class Dragon < Creature
  life 1340     # tough scales
  strength 451  # bristling veins
  charisma 1020 # toothy smile
  weapon 939    # fire breath
end

这可以避免等号问题。

答案 1 :(得分:2)

self.foo = ""使其将其视为一种方法。