Как я могу сохранить набор объектов в Perl? - PullRequest
4 голосов
/ 10 ноября 2010

Я хотел бы сохранить набор (Moose) объектов, чтобы каждый объект мог появляться только один раз.

Я подумал об использовании хеша, где ключом является адрес объекта, затем проверяю наличие ключа перед тем, как добавить объект. Это обычная практика? Как я могу получить адрес объекта?

UPDATE

Если подумать, что плохого в том, чтобы просто использовать ссылку на объект в качестве ключа:

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 ]

7 голосов
/ 10 ноября 2010

Вы можете использовать Set :: Object .

Чтобы получить адрес ссылки, вы можете использовать Scalar :: Util :: refaddr .

4 голосов
/ 10 ноября 2010

ПРИМЕЧАНИЕ Этот ответ применяется только в том случае, если вы хотите сохранить один объект на класс - если OP означает «один уникальный экземпляр объекта, но несколько экземпляров на класс», этот ответ неверен и Синан должен быть использован.

Распространенным шаблоном для реализации такого подхода (называемого Singleton) является реализация фабричного метода для создания таких объектов и хранилища для их хранения.

Итак, вы бы получили:

  • Пакет, содержащий фабрику и набор объектов
  • Этот пакет имеет хэш, ключом которого является тип объекта (вы можете использовать имя класса в качестве типа), а значением является объект этого типа.
  • Заводской метод make_object, который предоставляется в качестве одного из аргументов с типом объекта для создания
  • Метод доступа, возвращающий объект определенного типа (в основном поиск в хэше, упомянутом выше)
  • Опционально, метод "извлекать или создавать" с логикой if (!exists_object($type)) { make_object($type); return get_object($type) }
2 голосов
/ 10 ноября 2010

Если у вас есть ключ домена, который может быть выражен в виде скаляра, вы можете просто использовать обычный хеш.

A) У вас есть автомобили, идентифицированные по VIN-1, VIN-2 и VIN-3.Это могут быть ключи к хешу.

B) У вас есть машины, идентифицированные по типу: «седан», «внедорожник», «пикап».Но вы можете иметь несколько разных седанов.По сути, нет никакого доменного ключа, кроме уникального существования объекта.Это невозможно сделать с помощью хэша (если, как вы уже упоминали, вы не пытаетесь использовать адрес ссылки, хотя не знаете, насколько хороша эта практика).

1 голос
/ 10 ноября 2010

Я бы просто добавил MooseX :: Singleton к списку уже упомянутых одноэлементных решений.

0 голосов
/ 10 ноября 2010

Самый простой бит кода будет:

our $SINGLETON;
sub new {
    return $SINGLETON if $SINGLETON;
    # .... normal object creation
    $SINGLETON = $self;
    return $self;
}
...