完整代码: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将其视为一种方法?
答案 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 = ""
使其将其视为一种方法。