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, но, похоже, это применимо и к более поздним версиям.

Другие вопросы по тегам