2011-04-28 31 views
7

這是一個基本的問題,我擔心。看看下面的代碼。我想知道是否有辦法聲明slices屬性,以避免get_slicesadd_slice的樣板文件。如何使用Moose爲數組屬性添加便利功能?

package Gurke; 
use Moose; 

has slices => is => 'rw', isa => 'ArrayRef[Str]', default => sub { [] }; 

sub get_slices { return @{ $_[0]->slices } } 

sub add_slice { 
    my($self, $slice) = @_; 
    push @{ $self->slices }, $slice; 
    return; 
} 

no Moose; 
__PACKAGE__->meta->make_immutable; 

package main; # now a small test for the above package 
use strict; 
use warnings; 
use Test::More; 
my $gu = Gurke->new; 
$gu->add_slice('eins'); 
$gu->add_slice('zwei'); 
$gu->add_slice('drei'); 
my @sl = $gu->get_slices; 
is shift @sl, 'eins'; 
is shift @sl, 'zwei'; 
is shift @sl, 'drei'; 
done_testing; 

謝謝!

+0

我試圖想象黃瓜的樣子,你可以把東西切片...:d – simbabque 2014-02-02 16:34:08

回答

10

我是個初學者駝鹿,但我認爲你需要這個:

has slices => 
    is => 'rw', 
    isa => 'ArrayRef[Str]', 
    default => sub { [] }, 
    traits => ['Array'], 
    handles => { 
     add_slice => 'push', 
     get_slices => 'elements', 
    }, 
; 
+0

謝謝親愛的穆斯初學者。這有效,正是我想要的。我曾嘗試過'特質'和'處理過的',但沒有看到它們應該被合併。 - 如果你碰巧知道如何讓穆斯死於傳遞未聲明的屬性,我也會很感激。 :-) [如何使Moose構造函數在傳遞未聲明的屬性時死亡?](http://stackoverflow.com/questions/5818948) – Lumi 2011-04-28 12:58:15