为什么这个赋值在Ruby中失败?

时间:2012-12-01 02:55:45

标签: ruby

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

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

1 个答案:

答案 0 :(得分:2)

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

使用self.mymethod="foo"代替