Как определить переменные класса для экземпляра Singleton класса Ruby? - PullRequest
0 голосов
/ 01 апреля 2019

Как определить переменную класса для одноэлементного экземпляра класса?

Где именно переменная класса будет помещена для Ruby?От чего зависит расположение переменных класса?Область применения, лексический контекст или текущий класс?

class C
    class << self
        @@c = 1
    end
end
# C.class_variables => [:@@a]
# Why the class variables belong to C, instead of singleton instance of C?

class D
end
class << D
    @@d = 1
end
# Object.class_variables => [:@@d]
# warning: class variable access from toplevel
# Why the class variables belong to Object, instead of class D or singleton class of class D?

# How Ruby decide why to put the class variables?

1 Ответ

0 голосов
/ 01 апреля 2019

Для класса C представляется, что определение переменной класса в одноэлементном классе C эквивалентно определению той же переменной класса в C.

class C
  @@a = 0
  class << self
    @@c = 1
  end
end

class D < C
end

C.class_variables
  #=> [:@@a, :@@c] 
D.class_variables
  #=> [:@@a, :@@c] 
C.singleton_class.class_variables
  #=> [] 
D.singleton_class.class_variables
  #=> [] 

D.class_variable_get(:@@a)
  #=> 0 
D.class_variable_set(:@@a, 2)
  #=> 2 
D.class_variables
  #=> [:@@a, :@@c] 
C.class_variable_get(:@@a)
  #=> 2 

D.singleton_class.class_variable_get(:@@c)
  #=> 1 
D.singleton_class.class_variable_set(:@@c, 3)
  #=> 3 
C.singleton_class.class_variable_get(:@@c)
  #=> 3 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...