2011-07-28 21 views
2

我想設置一個屬性,該屬性是一個arrayrefs數組,強制nonarrayrefs數組參考。例如。如何設置AoArrayrefs屬性,使用標量強制轉換爲arrayref?

[0,[0,0,0],[1,2,3]]到[[0],[0,0,0],[1,2,3]]

也,我希望能夠以強制的方式推動或設置AoA元素。這是我的嘗試:

{ 
    package MyArray; 
    use namespace::autoclean; 
    use Moose::Util::TypeConstraints; 
    use Moose; 

    subtype 'My::ArrayRef' => as 'ArrayRef'; 
    coerce 'My::ArrayRef' 
     => from 'Num|Str' 
     => via {[$_]}; 

    has 'ents' => (
     traits => ['Array'], 
     is  => 'rw', 
     isa  => 'ArrayRef[My::ArrayRef]', 
     default => sub { [] }, 
     handles => { 
      push  => 'push', 
      get  => 'get', 
      set  => 'set', 
      elements => 'elements', 
      count  => 'count', 
     }, 
     coerce => 1, 
    ); 

    __PACKAGE__->meta->make_immutable; 

} 

use Modern::Perl; 

my $a0 = MyArray->new(ents => [ 0, [ 0, 0, 0 ], [1,2,3] ]) ; 

use Data::Dumper; 

print Dumper $a0; 

$a0->set(0,'cat'); 
print Dumper $a0; 
$a0->push(1.0); 
print Dumper $a0; 
+0

這是[crossposted](http://www.perlmonks.org/?node_id=917344)。 – ikegami

+0

可以使用crosspost嗎?這裏的界面稍微比較乾淨,似乎在工作中加載速度稍快。我不想違反任何規範! – Demian

+0

交叉是很好的,所以可以避免重複的工作,所以兩組都可以從響應中受益。 – ikegami

回答

4

該類型需要在強制之前未能匹配,但在之後成功。

這是卓有成效的(測試):上PerlMonks

my $array_ref = Moose::Util::TypeConstraints::find_type_constraint('ArrayRef'); 

# Create an alias so we don't affect others with our coercion. 
subtype 'My::Data::Structure' 
    => as 'ArrayRef[ArrayRef[Str|Num]]'; 

coerce 'My::Data::Structure' 
    => from 'ArrayRef[ArrayRef[Str|Num]|Str|Num]' 
     => via { [ map $array_ref->check($_) ? $_ : [ $_ ], @$_ ] }; 
+0

感謝您將我放在正確的道路上! – Demian

+0

@Demian,更新後檢查Str | Num。比原來更清潔。 – ikegami

+0

他的代碼在哪裏,你會讓你的代碼使它工作?我嘗試了各種各樣的地方,並且在2.0202下,我得到了相同的強制錯誤。 – Axeman