【发布时间】:2010-10-22 10:42:00
【问题描述】:
Moose 对象子程序在初始化后应该如何定义?
我正在使用 Moose 编写一个对象模块,我计划序列化 (nstore) 创建的对象。
检查以下(简化的!)示例:
package MyObj 0.001;
use Moose;
use namespace::autoclean;
has 'size' => (
is => 'ro',
isa => 'Int',
required => 1,
);
sub some_sub {
my ($self, @more) = @_;
if ($self->size() < 100) # do something;
elsif (($self->size() < 500)) # do something else;
elsif (($self->size() < 7500)) # do something else;
# ...
}
1;
some_sub 的行为因size 而不同。由于size 是只读的,所以在对象初始化后它保持不变。
所以,假设我调用some_sub 无数次,很遗憾我每次都必须通过所有ifs。
我最好在对象初始化后执行一次,然后将some_sub 设置为一个更简单的函数,根本没有ifs。
但是……我该怎么做呢?
更新
也许我应该添加一个 subref 类型的lazy 属性,它将保存对所选子例程的引用。然后some_sub 将简单地调用$self->chosen_sub->(@_)。你怎么看?
【问题讨论】:
标签: perl initialization moose