Если у меня есть класс с attr_accessor
, он по умолчанию создает переменную экземпляра вместе с соответствующими геттерами и сеттерами. Но вместо создания переменной экземпляра, есть ли способ заставить его создать переменную класса или переменную экземпляра класса вместо?
Как Ruby attr_accessor создает переменные класса или переменные экземпляра класса вместо переменных экземпляра?
Ответ 1
Вот так:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Вы можете рассматривать это как открытие метакласса класса (из которого сам класс является экземпляром) и добавления к нему атрибута.
attr_accessor
- это метод класса Class
, он добавляет к классу два метода: тот, который читает переменную экземпляра и другую, которая ее устанавливает. Здесь возможно выполнение:
class Class
def my_attr_accessor(name)
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |new_val|
instance_variable_set "@#{name}", new_val
end
end
end
Полностью непроверенный атрибут атрибута класса:
class Class
def class_attr_accessor(name)
define_method name do
class_variable_get "@@#{name}"
end
define_method "#{name}=" do |new_val|
class_variable_set "@@#{name}", new_val
end
end
end
Ответ 2
В Rails (или где угодно вы делаете require 'active_support'
) вы можете использовать cattr_accessor :name
, чтобы получить атрибуты истинного доступа к переменной класса.
Переменные экземпляра класса, которые другие указали, обычно более полезны. В APIdock cattr_accessor
странице есть полезное обсуждение, разъясняющее, когда вы захотите, а не другой, а также источник cattr_accessor
, cattr_reader
и cattr_writer
.