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

发布于 2024-07-21 13:17:24 字数 104 浏览 13 评论 0原文

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

If I have a class with an attr_accessor, it defaults to creating an instance variable along with the corresponding getters and setters. But instead of creating an instance variable, is there a way to get it to create a class variable or a class instance variable instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葵雨 2024-07-28 13:17:24

像这样:

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

Like this:

class TYourClass
  class << self
    attr_accessor :class_instance_variable
  end
end

You can look at this as opening the metaclass of the class (of which the class itself is an instance) and adding an attribute to it.

attr_accessor is a method of class Class, it adds two methods to the class, one which reads the instance variable, and other that sets it. Here's a possible implementation:

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

Completely untested class attribute accessor:

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
天涯沦落人 2024-07-28 13:17:24

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

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

In Rails, (or anywhere you do require 'active_support') you can use cattr_accessor :name to get the true class variable accessors.

The class instance variables that others have pointed out are usually more useful. The APIdock cattr_accessor page has some helpful discussion clarifying when you would want one not the other, plus the source to the cattr_accessor, cattr_reader and cattr_writer functions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文