我正在尝试制作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
这里发生了什么?有人可以解释为什么在调用方法中赋值会失败吗?
答案 0 :(得分:2)
在您的情况下,mymethod="foo"
将定义mymethod
本地变量
而不是调用mymethod=
方法。
使用self.mymethod="foo"
代替