29

如果我有一个带有 的类attr_accessor,它默认创建一个实例变量以及相应的 getter 和 setter。但是不是创建一个实例变量,有没有办法让它创建一个类变量或类实例变量呢?

4

2 回答 2

46

像这样:

class TYourClass
  class << self
    attr_accessor :class_instance_variable
  end
end

您可以将其视为打开类的元类(该类本身就是一个实例)并向其添加属性。

attr_accessor是 class 的一个方法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
于 2009-05-21T23:18:29.227 回答
20

在 Rails 中(或任何你做的地方require 'active_support')你可以使用cattr_accessor :name来获取真正的类变量访问器。

其他人指出的类实例变量通常更有用。APIdock页面有一些有用的讨论,阐明了您何时cattr_accessor需要一个而不是另一个,以及cattr_accessor,cattr_readercattr_writer函数的源代码。

于 2009-11-03T07:26:19.940 回答