2009-11-28 77 views
6

我想簡單地在Moose中聲明一個只讀屬性,該屬性不能在調用new時被初始化。所以宣佈後如下:如何防止在調用新的Perl Moose只讀屬性時設置?

package SOD::KuuAnalyze::ProdId; 

use Moose; 

has 'users' => (isa => 'ArrayRef[Str]', is => "ro"); 

1; 

我不想以下工作:

my $prodid = SOD::KuuAnalyze::ProdId->new(users => ["one", "two"]); 
+0

用戶沒有默認情況下,它是如何曾經得到集? – Schwern 2009-11-29 23:12:39

回答

13

使用init_arg屬性配置(請參閱「構造函數參數」,在Moose::Manual::Attributes):

package SOD::KuuAnalyze::ProdId; 
use Moose; 

has 'users' => (
    isa => 'ArrayRef[Str]', is => "ro", 
    init_arg => undef, # do not allow in constructor 
); 
1; 
+1

這很好用,謝謝。然而它默默地失敗了。有沒有辦法讓它在嘗試ProdId-> new(users => ['one','two'])時拋出錯誤? – ennuikiller 2009-11-29 14:00:20

+4

如果使用MooseX :: StrictConstructor,如果將任何無效或不允許的參數傳遞給構造函數,則模塊構造將失敗。我幾乎在所有的Moose類中都使用它(其餘的我使用MooseX :: SlurpyConstructor,它捕獲所有不被屬性使用的參數)。 – Ether 2009-11-29 17:26:44

4

如何

package SOD::KuuAnalyze::ProdId; 

use Moose; 

has 'users' => (isa => 'ArrayRef[Str]', is => 'ro', init_arg => undef, default => sub { [ 'one', 'two' ] }); 

設置init_argundef似乎有必要禁止設置來自構造函數的屬性。