Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?

Posted

技术标签:

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

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

【问题讨论】:

通过“Seeing Metaclasses Clearly”工作;在尝试理解 Ruby 的类和对象的工作方式时非常有用。 【参考方案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 提供了这个。谢谢!

以上是关于Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 类 - attr_accessor

ruby 类 - attr_accessor

晕菜了,Ruby类中的变量!

扩充类

ruby学习笔记

这行 Ruby 代码在做啥? [复制]