首页 > 解决方案 > 如何在 Ruby 的 attr_reader 和 attr_writer 中使用变量@@?

问题描述

Ruby 有这种方式通过使用键来共享实例变量,例如

attr_accessor :v
attr_reader :v
attr_writer :v

除了全局 @@variable 对象,如何使用它?每个类都可以使用与每个对象实例共享的变量。如何创建存取器?唯一正确的方法是

def zmienna=(a)
 @@zmienna = a
end

标签: rubyvariables

解决方案


Ruby 中没有这样的东西。但是编写自己的并不难:

class Module
  def mattr_writer(*attrs)
    attrs.each do |attr|
      define_singleton_method(:"#{attr}=") do |val|
        class_variable_set(:"@@#{attr}", val)
      end
    end
  end

  def mattr_reader(*attrs)
    attrs.each do |attr|
      define_singleton_method(attr) do
        class_variable_get(:"@@#{attr}")
      end
    end
  end

  def mattr_accessor(*attrs)
    mattr_reader(*attrs)
    mattr_writer(*attrs)
  end
end

class Foo; end
Foo.mattr_accessor(:bar)
Foo.bar = 42

Foo.bar #=> 42

Foo.bar = 23

Foo.bar #=> 23

或者,您可以使用已经提供这些方法的 ActiveSupport。

但是,由于大多数样式指南不鼓励使用类层次结构变量,因此为它们设置访问器并没有多大意义。


推荐阅读