【问题标题】:Ruby deduplication and tracking instancesRuby 重复数据删除和跟踪实例
【发布时间】:2013-07-20 09:35:42
【问题描述】:

我想跟踪一个类的所有实例,下面的代码运行良好,但不是很干。

class BaseClass
end

class ClassA < BaseClass
  @@instances = []
  attr_accessor :name

  def initialize(name)
    @name = name
    @@instances << self
  end
  def self.list
    @@instances
  end
  def to_s
    @name
  end
end

class ClassB < BaseClass
  @@instances = []
  attr_accessor :name

  def initialize(name)
    @name = name
    @@instances << self
  end
  def self.list
    @@instances
  end
  def to_s
    @name
  end
end

puts "Creating instances"
a = ClassA.new "a"
aa = ClassA.new "aa"
b = ClassB.new "b"

puts "Listing for ClassA"
puts ClassA.list
puts "Listing for ClassB"
puts ClassB.list

其中的输出变为

Creating instances
Listing for ClassA
a
aa
Listing for ClassB
b

完美。但是,当我尝试像这样进行重复数据删除时

class BaseClass
  @@instances = []
  attr_accessor :name

  def initialize(name)
    @name = name
    @@instances << self
  end
  def self.list
    @@instances
  end
  def to_s
    @name
  end
end

class ClassA < BaseClass
end

class ClassB < BaseClass
end

puts "Creating instances"
a = ClassA.new "a"
aa = ClassA.new "aa"
b = ClassB.new "b"

puts "Listing for ClassA"
puts ClassA.list
puts "Listing for ClassB"
puts ClassB.list

我得到以下输出

Creating instances
Listing for ClassA
a
aa
b
Listing for ClassB
a
aa
b

这是有道理的,因为@@instances 是在BaseClass 中定义的,并且与ClassAClassB 共享。

我怎样才能让我的代码去重看起来像后一个示例,使其表现得像前一个示例?

【问题讨论】:

    标签: ruby class object inheritance dsl


    【解决方案1】:

    最简单的方法是摆脱你试图做的伎俩,并使用ObjectSpace.each_object

    class BaseClass
      attr_accessor :name
      def initialize(name); @name = name end
      def to_s; @name end
    end
    
    class ClassA < BaseClass; end
    
    class ClassB < BaseClass; end
    
    puts "Creating instances"
    a = ClassA.new "a"
    aa = ClassA.new "aa"
    b = ClassB.new "b"
    puts "Listing for ClassA"
    puts ObjectSpace.each_object(ClassA).to_a
    puts "Listing for ClassB"
    puts ObjectSpace.each_object(ClassB).to_a
    

    这给了

    Creating instances
    Listing for ClassA
    aa
    a
    Listing for ClassB
    b
    

    【讨论】:

    • 完美。为了完整起见,我将列表函数更新为 def self.list; ObjectSpace.each_object(Object.const_get(name)).to_a end
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多