在 Ruby 中获取 attr_accessor/实例变量

8
我知道在Ruby中可以通过调用#instance_variables获取所有实例变量,但如果它们尚未设置,则不会显示出来。 示例
class Walrus
  attr_accessor :flippers, :tusks
end

w = Walrus.new
w.instance_variables # => []
w.tusks              # => nil
w.instance_variables # => [:@tusks]

我想立即访问由attr_accessor定义的所有实例变量。
w = Walrus.new
w.instance_variables # => [:@tusks, :@flippers]

可能是重复的问题:如何获取通过attr_reader或attr_accessor定义的属性 - Aidan Feldman
3个回答

15

好的,它们还不存在。实例变量在第一次赋值时才会出现。如果你想要它们存在于全新的实例中,那么在构造函数中初始化它们。

class Walrus
  attr_accessor :flippers, :tusks

  def initialize
    self.flippers = self.tusks = nil
  end
end

w = Walrus.new
w.instance_variables # => [:@tusks, :@flippers]

5

attr_accessor 创建了一对方法,即 setter 和 getter。我不确定是否有内置的方法可以获取列表,但您可以查看生成的一对实例方法:

Walrus.instance_methods.find_all do |method|
  method != :== &&
  method != :! &&
  Walrus.instance_methods.include?(:"#{method}=")
end

0

不使用 Object 或 Class 中的方法,你觉得怎么样?返回的数组将包含你定义的属性/方法以及在 getter/accessor 中定义的实例变量。

your_instance_name.methods - Object.methods
your_instance_name.methods - Class.methods

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接