【问题标题】:How can Ruby's attr_accessor produce class variables or class instance variables instead of instance variables?Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?
【发布时间】:2010-10-28 02:25:18
【问题描述】:

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

【问题讨论】:

标签: ruby instance-variables class-variables class-instance-variables


【解决方案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

【讨论】:

  • 谢谢。我喜欢你说它打开类的元类并添加附录的方式。但是为什么它会产生一个类实例变量而不是一个类变量呢?是否有可能让它也产生一个类变量,还是这种语法只适用于类实例变量?
  • 我不一样,再看答案
  • 这仅适用于类实例变量,b/c attr_* 为(某些对象的)实例变量定义方法。
  • instance_variable_set 和 class_variable_set 的参数之间有一些 "," 缺失,但编辑太小无法提交。
【解决方案2】:

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

其他人指出的类实例变量通常更有用。 APIdock cattr_accessor page 进行了一些有益的讨论,阐明了您何时需要一个而不是另一个,以及 cattr_accessorcattr_readercattr_writer 函数的来源。

【讨论】:

  • 更容易 - 不知道 rails 提供了这个。谢谢!
猜你喜欢
  • 2014-09-21
  • 2013-03-24
  • 2021-07-29
  • 1970-01-01
  • 2015-04-29
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多