Подтвердить что ты не робот

Как Ruby attr_accessor создает переменные класса или переменные экземпляра класса вместо переменных экземпляра?

Если у меня есть класс с attr_accessor, он по умолчанию создает переменную экземпляра вместе с соответствующими геттерами и сеттерами. Но вместо создания переменной экземпляра, есть ли способ заставить его создать переменную класса или переменную экземпляра класса вместо?

4b9b3361

Ответ 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.