2012-02-16 51 views
0

我在穆斯参数对象其文件的通配符的属性glob的Perl的驼鹿哈希性状

所以我不得不这样做

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

不要忘记点击大对号接受的答案! – RickF 2012-02-20 13:37:56

回答

4

是的,使用对象作为纯哈希是不好的。

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

如果您需要能够得到一个JobParameters :: Base的对象作为哈希的内容,然后添加一个to_hash方法JobParameters ::基地,并委托给你的属性,方法...

这意味着如果稍后将缓存(例如!)添加到JobParameters :: Base中,并使用__cache键存储内部数据,则可以通过更改to_hash方法以从hash中移除内部数据它返回。

这是好的存储的属性只是一个哈希,但如果你存储祝福散列,那么没有达到进入它的胆量..

+0

我认为这是前进的方向。我正在努力编写更少的奥术perl,这是我的getInputFileParams sub – KeepCalmAndCarryOn 2012-02-16 15:38:35

+0

更具体地说,在你的问题中,在JobParameters :: Base中编写一个方法,返回你想要的参数流,以便你可以直接迭代该流。 – perigrin 2012-02-17 00:33:10

-1

你在得到了所有的工具,以替代穆斯类的定义,你只是不使用它们 - 试试这个:

return $self->keys_extraParams

+1

$ self-> extraParams->键需要使用Moose :: Autobox,这并不总是一个好选择。 – 2012-02-16 15:31:19

+0

其实'keys'是他从'traits => [Hash]'(Moose :: Meta :: Attribute :: Native :: Trait :: Hash)获得的方法。不需要Autobox。 – RickF 2012-02-16 15:59:12

+0

@RickF:不,原生属性特征仍然不会让您将哈希视为您可以调用方法的对象。它在原始对象*上定义了方法*,而不是散列,所以你可以执行'$ self-> keys'(尽管你应该把方法命名为更好的方法,比如extraParamKeys)。 – Ether 2012-02-16 16:48:00