我有一個Moose類,
has 'unique_ints' => (
是=> 'rw'。
isa => 'ArrayRef[Int]',
default => sub { [] }。
);
哪種方法可以保證unique_int的唯一性呢?
uj5u.com熱心網友回復:
Moose屬性可以有一個trigger屬性,每當該屬性被改變時就會被呼叫。該屬性是對一個方法的參考,該方法被傳遞給物件和該屬性的新舊版本。所以我們可以這樣寫:
package UniqInt;
use Moose;
use List::Util 'uniqint'/span>;
有 'unique_ints' => (
is => 'rw'。
isa => 'ArrayRef[Int]',
default => sub { [] },
trigger => &_ensure_uniq,
);
sub _ensure_uniq /span>{
my $self = shift;
my ($new) = @_;
$self->{unique_ints} = [ uniqint @$new ];
}
1;
注意,在觸發方法中,我們使用直接哈希訪問屬性的值,因為再次呼叫突變器將再次呼叫觸發方法,并使我們陷入無限的遞回坑。
我們可以這樣來測驗該方法:
#!/usr/bin/perl
use strict;
使用警告。
use feature 'say';
use UniqInt;
my $obj = UniqInt->new;
$obj->unique_ints([1 ... 5] )。
say join ',', @{$obj-> unique_ints};
$obj->unique_ints([1 ... 5, 1 ... 5]) 。
say join ',', @{$obj-> unique_ints};
正如預期的那樣,產生了這樣的輸出:
1, 2,3,4,5。
1,2,3,4,5。
更新:還請注意,由于我對觸發方法的第三個引數(也就是屬性的前一個值)沒有用處,所以我忽略了它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/311371.html
標籤:
