2012-02-16 59 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