我有
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)
的最佳方法是什么?
答案 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