То, что вы делаете, это определение переменной экземпляра на уровне класса (поскольку классы являются экземплярами класса Class, это работает просто отлично).
И нет, инициализации нет.
Редактировать: У вас есть небольшое заблуждение в вашем редактировании. attr_accessor
не добавляет переменную экземпляра в класс. В буквальном смысле это так (используя ваш пример my
):
def my; @my; end
def my=(value); @my = value; end
Он не создает и не инициализирует переменную экземпляра, он просто определяет два метода. И вы могли бы очень хорошо написать свой собственный метод класса, который делает подобные вещи, используя define_method
.
Редактировать 2:
Чтобы дополнительно проиллюстрировать, как можно написать такой метод:
class Module
def array_attr_accessor(name)
define_method(name) do
if instance_variable_defined?("@#{name}")
instance_variable_get("@#{name}")
else
instance_variable_set("@#{name}", [])
end
end
define_method("#{name}=") do |val|
instance_variable_set("@#{name}", val)
end
end
end
class Test
array_attr_accessor :my
end
t = Test.new
t.my # => []
t.my = [1,2,3]
t.my # => [1, 2, 3]