我在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',
},
);
然而,因为它不是哈希引用而窒息。我错过了什么或者正在使用该对象作为哈希错误
答案 0 :(得分:4)
是的,将对象用作普通哈希是不好的。
您正在直接访问其内部状态,绕过它们可能出现的任何接口,并使您的类与JobParameters :: Base类的内部表示紧密耦合。
如果您需要能够将JobParameters :: Base对象的内容作为哈希值获取,那么将to_hash方法添加到JobParameters :: Base,并委托属性中的该方法...
这意味着如果稍后您将缓存(例如!)添加到JobParameters :: Base,并使用__cache密钥来存储内部数据,您还可以通过更改to_hash方法以从中删除内部数据来安全地进行此更改它返回的哈希。
将属性存储为哈希是很好的,但是如果你要存储一个有福的哈希,那就不要达到它的胆量......
答案 1 :(得分:-1)
你已经在Moose类定义中使用了所有工具,你只是没有使用它们 - 试试这个:
return $self->keys_extraParams