Perl Moose Hash的特质

时间:2012-02-16 13:25:37

标签: perl hash moose traits

我在Moose中有一个参数对象,它具有文件通配符到glob

的属性

所以我有一个方法来做到这一点

sub getInputFileParams{
    my ($self) = @_;

    #the only parameters passed in are in fact the input files
    return keys(%{$self->{extraParams}});
}

但是我为什么不将属性作为哈希迭代?

has 'extraParams' => (
    is        => 'ro',
    isa       => 'JobParameters::Base',
    default   => sub { {} },
    traits    => ['Hash'],
    handles   => {
       keys_extraParams => 'keys',
    },

);

然而,因为它不是哈希引用而窒息。我错过了什么或者正在使用该对象作为哈希错误

2 个答案:

答案 0 :(得分:4)

是的,将对象用作普通哈希是不好的。

您正在直接访问其内部状态,绕过它们可能出现的任何接口,并使您的类与JobParameters :: Base类的内部表示紧密耦合。

如果您需要能够将JobParameters :: Base对象的内容作为哈希值获取,那么将to_hash方法添加到JobParameters :: Base,并委托属性中的该方法...

这意味着如果稍后您将缓存(例如!)添加到JobParameters :: Base,并使用__cache密钥来存储内部数据,您还可以通过更改to_hash方法以从中删除内部数据来安全地进行此更改它返回的哈希。

将属性存储为哈希是很好的,但是如果你要存储一个有福的哈希,那就不要达到它的胆量......

答案 1 :(得分:-1)

你已经在Moose类定义中使用了所有工具,你只是没有使用它们 - 试试这个:

return $self->keys_extraParams