Ruby ищет переменную класса в объекте вместо определенного класса
Эта часть работает:
class Example1
@@var1= "var1 in the Example1"
def get_var1
@@var1
end
end
example1 = Example1.new
example1.get_var1
# => "var1 in the Example1"
но если я попробую eigenclass:
def example1.get_var1
@@var1
end
example1.get_var1
# NameError: uninitialized class variable @@var1 in Object
# from (pry):128:in `get_var1'
Рубин выглядит @@var1
в Object
вместо Example
,
Я протестировал этот код в Ruby 1.9.3 и 2.0 с тем же результатом.
Почему это происходит?
Во-вторых, мы можем выключить его (так example.get_var1
не будет искать переменные класса в объекте)?
1 ответ
Похоже, что лексическая область для поиска переменных класса является какой-то дурацкой. Насколько я могу судить, потому что вы не внутри
class Example1
end
block, ruby ищет не @@var в вашем классе, а скорее из Object. Если вы хотите это явно от вашего класса, вы можете сделать:
def example1.get_var
self.class.class_variable_get(:@@var1)
end
Я наткнулся на https://www.ruby-forum.com/topic/1228428 во время поиска ответа. Они говорят о 1.8.7, но, похоже, это применимо и к более поздним версиям.