ruby - 如何在 Ruby 的 attr_reader 和 attr_writer 中使用变量@@?
问题描述
Ruby 有这种方式通过使用键来共享实例变量,例如
attr_accessor :v
attr_reader :v
attr_writer :v
除了全局 @@variable 对象,如何使用它?每个类都可以使用与每个对象实例共享的变量。如何创建存取器?唯一正确的方法是
def zmienna=(a)
@@zmienna = a
end
解决方案
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。
但是,由于大多数样式指南不鼓励使用类层次结构变量,因此为它们设置访问器并没有多大意义。
推荐阅读
- reactjs - 让用户选择使用firebase reactjs的排序类型
- c++ - 初始化引用成员的正确 C++ 方法是什么
- google-apps-script - 创建一个包含日期的数组,并在第一个日期和最后一个日期之间添加天数,周六和周日除外
- vue.js - Vue 渲染函数和 Vuetify ui 组件
- flutter - 按下谷歌登录按钮时奇怪的透明覆盖动画
- rdf - 如何使用 rdf/rdfs 表示一个类的每个实例都有一个属性 (hasName),其中 Literal 作为对象?
- c - C 中的标头是必需的吗?
- java - spring mongo存储库无法转换带有字段数组类型的对象
- javascript - 如何在 iOS Safari 上使用 javascript 下载 JSON 文件?
- haskell - 为什么不在 Haskell 中编译 foldr const 0 "tacos" ?