我正在尝试制作 DSL,但遇到了一些让我感到困惑的事情。在我的调用方法中,我想在评估块之前为 @mymethod 设置一个初始值。如果我直接分配给变量,它会起作用:
class Test
class << self
attr_accessor :mymethod
end
def self.call(&block)
@mymethod="foo"
class_eval &block
end
end
Test.call do
puts "mymethod returned: #{mymethod}"
mymethod = "bar"
puts "mymethod is now: #{mymethod}"
end
返回:
[1] pry(main)> load 'test.rb'
mymethod returned: foo
mymethod is now: bar
=> true
但我觉得这应该有效,但没有。唯一改变的是 @ 已从分配给 mymethod 中删除,所以我认为它应该使用由 attr_accessor 创建的 mymethod= 方法:
class Test
class << self
attr_accessor :mymethod
end
def self.call(&block)
mymethod="foo"
class_eval &block
end
end
Test.call do
puts "mymethod returned: #{mymethod}"
mymethod = "bar"
puts "mymethod is now: #{mymethod}"
end
但是,调用内部对 mymethod 的分配失败,而块内的相同分配成功:
[1] pry(main)> load 'test.rb'
mymethod returned:
mymethod is now: bar
=> true
这里发生了什么?有人可以向我解释为什么在调用方法中分配会失败吗?