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]
4

3 回答 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]
于 2012-05-18T14:04:34.523 回答
5

好吧,attr_accessor创建一对方法,一个 setter 和一个 getter。我不确定是否有内置方法来获取列表,但您可以查看结果对的实例方法:

Walrus.instance_methods.find_all do |method|
  method != :== &&
  method != :! &&
  Walrus.instance_methods.include?(:"#{method}=")
end
于 2012-05-18T14:16:18.257 回答
0

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

your_instance_name.methods - Object.methods
your_instance_name.methods - Class.methods
于 2015-02-15T05:23:34.523 回答