了解attr_accessor类方法的自我

kri*_*sna 6 ruby attr-accessor

class Test
  class << self
    attr_accessor :some

    def set_some
      puts self.inspect
      some = 'some_data'
    end
    def get_some
      puts self.inspect
      some
    end
  end
end

Test.set_some => Test
puts Test.get_some.inspect => Test nil
Run Code Online (Sandbox Code Playgroud)

在上面我可以找到自己作为测试本身但不返回some_data输出.

但是,当我按以下方式修改时,它返回预期的输出

class Test
  class << self
    attr_accessor :some

    def set_some
      puts self.inspect
      self.some = 'some_data'
    end
    def get_some
      puts self.inspect
      self.some
    end
  end
end

Test.set_some => Test
puts Test.get_some.inspect => Test some_data
Run Code Online (Sandbox Code Playgroud)

有什么区别?

编辑

现在在第一个例子中,如果我将get some方法设置为

Test.some = 'new_data'
puts Test.some.inspect #=> new_data
Test.set_some
puts Test.get_some.inspect => new_data
Run Code Online (Sandbox Code Playgroud)

现在它让我更加困惑.

Rea*_*onk 12

some = :foo让ruby认为它应该创建一个名为的新局部变量some.如果你想打电话some=(),你必须使用一个明确的接收器 - 如self.some = :foo.我曾经打过赌注...: - /


lza*_*zap 1

在第一个示例中它是(局部)变量