1

我正在尝试制作 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

这里发生了什么?有人可以向我解释为什么在调用方法中分配会失败吗?

4

1 回答 1

2

在您的情况下,mymethod="foo"将定义mymethod局部变量
而不是调用mymethod=方法。

self.mymethod="foo"改为使用

于 2012-12-01T03:16:34.350 回答