Ruby:列出未从其基础继承的对象的实例变量

时间:2016-07-29 06:21:26

标签: ruby

使用instance_variables方法返回对象中所有实例变量的列表,包括从其继承链继承的实例变量。

有没有办法只在类中定义实例,而不是从基类定义?

2 个答案:

答案 0 :(得分:3)

在Ruby中,未声明实例变量。它们只在第一次访问时才会生效。因此,在任何给定时刻,同一类的两个对象可以具有完全不同的实例变量集。

当涉及实例变量时,类继承完全无关紧要,因为它们与类定义无关。唯一远程相关的事情可能是找出在哪个方法执行时创建了一个实例变量,以及该方法属于哪个类,但是不可能实现AFAIK,而且我认为没有任何好处。

答案 1 :(得分:1)

我没有找到任何明确的解决方案(可能需要更多时间进行研究),但我想建议下一个代码:

class A
  attr_accessor :a, :c
  def initialize(a)
    @a = a
    @c = 1
  end
end

class B < A
  attr_accessor :b, :d
  def initialize(b, a)
    @b = b
    @d = 1
    super(a)
  end
end

def test
  t = B.new(1, 2)
  getters = t.instance_variables.map{ |i| i.to_s.gsub('@', '') }
  parents = B.ancestors.drop(1)

  parents.each do |i|
    curr = i.instance_methods.map(&:to_s)
    getters.each do |gt|
      if curr.include?(gt)
        getters.delete(gt)
      end
    end
  end

  getters
end

test() # => ['b', 'd']

更新:我在'Well Grounded Rubyist'中找到了有趣的注释:

  

类在Ruby中很重要;它们是捆绑和标签的一种方式   行为(你可以有一个Person类,一个Task类等)和   轻松创建具有相似行为的多个对象。但是 - 并且在   在这方面,Ruby与其他一些面向对象不同   语言 - 真正的行动是与各个对象:每个对象   有可能“学习”其班级没有的行为(方法)   教它。

MladenJablanović回答了你的问题。