如何在Perl中保留一组对象?

时间:2010-11-10 16:49:31

标签: perl data-structures reference set

我想保留一组(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) {
...
}

5 个答案:

答案 0 :(得分:7)

您可以使用Set::Object

要获取参考地址,您可以使用Scalar::Util::refaddr

答案 1 :(得分:4)

注意此答案仅适用于您希望保留一个对象每个类 - 如果OP意味着“一个唯一的对象实例但每个类有多个实例”,这个答案是错的,应该使用思南。

实现这种方法(称为Singleton)的一种常见模式是实现用于创建此类对象的工厂方法和用于保留它们的存储。

所以,你会:

  • 包含工厂和对象集的包
  • 该包有一个哈希,键是类型对象(您可以使用类名作为类型),值是该类型的对象。
  • 工厂方法make_object,作为参数之一提供 对象
  • 一个访问器返回一个特定类型的对象(基本上是上面提到的哈希中的查找)
  • 可选地,使用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;
}