如何避免创建具有相同属性的对象

时间:2019-02-03 18:05:41

标签: ruby

我有

   IIF(T1.MBR_STAT  = CAST(T2.MEMSTA_SHORT_NAME AS VARCHAR(10)),'MATCH', 'DON''T MATCH')    AS MBR_STAT_VALIDATION,

检查节点是否已经存在相同名称并避免创建class Node attr_accessor :name def initialize(name) @name = name end end node1 = Node.new(1) node2 = Node.new(1) 的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您必须自己实现。这不是普遍的需求,因此不是内置的方式来做到这一点。

一种方法是像这样使用Set:

require 'set'

class Name
  NAMES = Set.new

  def initialize(name)
    if self.class::NAMES.member?(name)
      raise("already used this value") 
    else
      @name = name
      self.class::NAMES.add(name)
    end
  end
end

您还可以将数组与include一起使用吗?但是性能较差。

还要注意,您确实需要使用raise-没有另一种方法可以“取消”对象的初始化。

答案 1 :(得分:2)

如果在使用重复参数调用 :: new 方法时期望发生异常,请查看answer of @maxpleaner
但是,如果您需要引用使用此参数创建的对象,请使用其他方法:

class Name
  @@names = {}

  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def self.new(name)
    @@names[name] || @@names[name] = super
  end
end

现在您可以对其进行测试:

n1 = Name.new(1)
n2 = Name.new(2)
n2a = Name.new(2)
puts n1.object_id, n2.object_id, n2a.object_id
puts n2 == n2a

就我而言,它会打印:

5296300
5264360
5264360
true