Переменная класса, использующая attr_accessor внутри класса ‹‹ self

Может кто-нибудь объяснить, почему self.foo= работает вне класса ‹‹ self, а foo= не работает внутри класса ‹‹ self.

class A
  class << self
    attr_accessor :foo
    foo = 'foo'
  end
end

p A.foo # => "nil"

class A
  class << self
    attr_accessor :foo
  end
  self.foo = 'foo'
end

p A.foo # => "foo"

Это не тот же вопрос, что и Когда использовать 'self' в Ruby

Чтобы было ясно, я не спрашиваю, когда использовать self. Я спрашиваю, почему я не могу установить переменную класса внутри блока «класс ‹‹ self», но могу вне его.


person TheJKFever    schedule 16.07.2015    source источник


Ответы (1)


ваш второй пример не является переменной класса, это переменная экземпляра класса для этого класса, доказательство заключается в том, что если вы унаследовали это, вы получите ноль

class A
  class << self
    attr_accessor :foo
  end
  self.foo = 'foo'
end

class B < A
end

B.foo # => nil

Итак, если вы хотите добавить переменную класса в class << self, вы можете использовать @@

class A

  class << self
  @@foo = :foo
    def foo
      @@foo
    end
  end
end
person Moustafa Samir    schedule 16.07.2015
comment
Причина, по которой я хочу использовать attr_accessor, заключается в том, что я хочу, чтобы подклассы имели разные значения для foo. Принимая во внимание, что если я изменю foo в подклассе, это также изменит значение A.foo - person TheJKFever; 16.07.2015
comment
Так вы действительно имеете в виду, что это переменная экземпляра класса, верно? - person Moustafa Samir; 16.07.2015
comment
хм, я так думаю. Звучит немного смешно, но это делает работу. - person TheJKFever; 16.07.2015