Почему нельзя получить доступ к переменной экземпляра класса в определении одноэлементного класса в Ruby?

class MyClass
  @my_class_instance_variable = "here"

  p @my_class_instance_variable # => "here"

  class << self
    p @my_class_instance_variable # => nil
  end
end

class MyClass
  p @my_class_instance_variable # => "here"
end

Почему второй p Распечатать nilкогда третий p печать "here"? Мое понимание определения класса синглтона (class << self), что он имеет ту же область видимости, что и определение класса (class MyClass).

(Этот вопрос имеет похожее название, но имеет другую направленность.)

1 ответ

Решение

Насколько я понимаю, определение одноэлементного класса (class << self) таково, что оно имеет ту же область видимости, что и определение класса.

Нету. Сфера отличается. Вы определили @my_class_instance_variable в объеме MyClass, но пытаемся получить к нему доступ, если MyClassСинглтон-класс.

Это так же легко проверить, как:

class Foo
  puts self #=> Foo

  class << self
    puts self #=> #<Class:Foo>
  end
end

С выходом:

Foo
#<Class:Foo>
Другие вопросы по тегам