我想保留一组(Moose)对象,因此每个对象只能出现一次。
我想过使用哈希,其中键是对象的地址,然后在添加对象之前检查键的存在。这是一种常见的做法吗?如何获取对象的地址?
更新
第二个想法,简单地使用对象引用作为关键是错误的:
my %objects = ();
# some object (just created or or taken from somewhere...)
my $object ...
# add object to set
$objects{$object} = $object;
# operate on all objects
foreach my $obj (values %objects) {
...
}
答案 0 :(得分:7)
您可以使用Set::Object。
要获取参考地址,您可以使用Scalar::Util::refaddr。
答案 1 :(得分:4)
注意此答案仅适用于您希望保留一个对象每个类 - 如果OP意味着“一个唯一的对象实例但每个类有多个实例”,这个答案是错的,应该使用思南。
实现这种方法(称为Singleton)的一种常见模式是实现用于创建此类对象的工厂方法和用于保留它们的存储。
所以,你会:
if (!exists_object($type)) { make_object($type); return get_object($type) }
答案 2 :(得分:2)
如果您有一个可以表示为标量的域密钥,则可以使用常规哈希。
A)您有VIN-1和VIN-2以及VIN-3识别的汽车。那些可以是哈希的关键。
B)你有按型号识别的汽车,'轿车','SUV','接送'。但是你可以拥有多种不同的轿车。本质上,除了对象的唯一存在之外,没有域密钥。这不能用哈希来完成(除非你提到你尝试使用引用的地址,不知道有多好的做法)。
答案 3 :(得分:1)
我只是将MooseX::Singleton添加到已经提到的单例解决方案列表中。
答案 4 :(得分:0)
最简单的代码是:
our $SINGLETON;
sub new {
return $SINGLETON if $SINGLETON;
# .... normal object creation
$SINGLETON = $self;
return $self;
}