Пожалуйста, помогите мне понять переменные экземпляра класса.Переменные экземпляра класса в Ruby
@@ - это переменная класса и эквивалентна переменной экземпляра (@) в экземпляре класса.
Но что такое переменная экземпляра (@) при использовании на уровне класса? Если он помещает определение в экземпляр класса, то почему бы не определить его в инициализаторе?
class MyClass
cattr_reader :class_variable
def self.new_instance(cv, cliv, iv)
@@class_variable = cv
@class_level_instance_variable = cliv
self.new(iv)
end
def initialize(iv)
@instance_variable = iv
end
def use
puts "class_var=#{self.class.class_variable.inspect}\ninst_var=#{@instance_variable.inspect}\ncliv=#{@class_level_instance_variable.inspect}"
end
end
c = []
c << MyClass.new_instance(1,2,3)
c[0].use
c << MyClass.new_instance(4,5,6)
c[1].use
c << MyClass.new_instance(7,8,9)
c[2].use
c[0].use
c[1].use
c[2].use
Когда вы задаете переменную экземпляра на уровне класса, она становится переменной экземпляра класса, которая немного отличается (и не является эквивалентной) переменной класса. Больше информации здесь: http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ –
@Marek Lipka: так, если бы я понял правильно, класс переменные экземпляра уровня полностью эквивалентны предварительно инициализированным переменным экземпляра экземпляра экземпляра, и если я делаю несколько экземпляров класса в методе класса, каждый из этих экземпляров будет инициализирован этой переменной. – Paul
Нет, такого поведения вообще нет. Я имею в виду только переменную экземпляра класса, которая является переменной * regular * экземпляра, но привязана к объекту класса (помните, что в классах Ruby также есть объекты). –