Как может attr_accessor Ruby создавать переменные класса или переменные экземпляра класса вместо переменных экземпляра? - PullRequest
29 голосов
/ 22 мая 2009

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

Ответы [ 2 ]

46 голосов
/ 22 мая 2009

Как это:

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
20 голосов
/ 03 ноября 2009

В Rails (или где-либо еще require 'active_support') вы можете использовать cattr_accessor :name, чтобы получить истинные методы доступа к переменным класса.

Переменные экземпляра класса, на которые указывали другие, обычно более полезны. Страница APIdock cattr_accessor содержит полезное обсуждение, поясняющее, когда вы хотите, чтобы одно не другое, а также источник функций cattr_accessor, cattr_reader и cattr_writer.

...