2011-07-14 10 views
3

変数の呼び出しからオブジェクトの呼び出しへの内部変数の処理を中断するのは、Attribute :: Native :: Traitハンドラを使用すると簡単です。しかし、どのように複数のデータ構造に対処していますか? StashにMy :: Stash :: Attributeオブジェクトのarrayrefを作らずに、以下のような処理をする方法は考えられません。これには配列参照を含むMy :: Stash :: Subattributeオブジェクトの配列参照が含まれていますMy :: Stash :: Instanceオブジェクト。これは、私が物事を並べ替えると、スタックの各レベルのデータを大量に混ぜ合わせて強制します。多次元データ構造のムービー特性

はい、私はフラットな配列としてアイテムを保存してから、読み取りごとにgrepしますが、読み取りが頻繁で、ほとんどの呼び出しが読み取りであるため、配列項目の大きなリストに対してグリッピングすることは、すべての読書は、必要な方法でアイテムを内部的に索引付けするだけです。

読み込みアクセサーをハッシュリファレンスとして扱い、代わりに修正するのではなく、ハンドラーがメソッドを作成することで、このようなことを処理できるMooseX拡張機能がありますか?あるいは、私はこのようなことをメソッド呼び出しでやっていることを忘れて、それをそのままの状態でやっていますか?

use strict; 
use warnings; 
use 5.010; 

package My::Stash; 
use Moose; 

has '_stash' => (is => 'ro', isa => 'HashRef', default => sub { {} }); 

sub add_item { 
    my $self = shift; 
    my ($item) = @_; 

    push @{$self->_stash->{$item->{property}}{$item->{sub}}}, $item; 
} 

sub get_items { 
    my $self = shift; 
    my ($property, $subproperty) = @_; 

    return @{$self->_stash->{$property}{$subproperty}}; 
} 

package main; 
use Data::Printer; 

my $stash = My::Stash->new(); 

for my $property (qw/foo bar baz/) { 
    for my $subproperty (qw/fazz fuzz/) { 
    for my $instance (1 .. 2) { 
     $stash->add_item({ property => $property, sub => $subproperty, instance => $instance }) 
    } 
    } 
} 

p($_) for $stash->get_items(qw/baz fuzz/); 

答えて

1

は、これらは非常に難解です:

sub add_item { 
    my $self = shift; 
    my ($item) = @_; 

    push @{$self->_stash->{$item->{property}}{$item->{sub}}}, $item; 
} 

のでadd_itemはハッシュリファレンスitemを取り、それ自身のキーproperty、およびsubでインデックス化スタッシュで配列のキーにそれをプッシュします。

sub get_items { 
    my $self = shift; 
    my ($property, $subproperty) = @_; 

    return @{$self->_stash->{$property}{$subproperty}}; 
} 

逆に、get_itemは二つの引数、$property$subpropertyを取り、それがHOHでアレイ内の適切な要素を検索します。 - これはトレイトで予測可能な動作のために必要とされるであろう

  • のみハッシュは値であることを主張する非魔法のハッシュで方法はありません。だからここ

    はMooseXそれを作るに懸念があります。あなたの例のように、_stash->{$property}がスカラーに解決されたらどうなるでしょうか?

  • add_itemは、propertysubにハードコードされています。配列を返す
  • が悪い、それは通常のムースハッシュ形質が配列リファレンスを受け入れることができなかった理由を今まず、私は表示されません

スタックにプッシュされる(リターン・参考文献)のすべての要素が必要ですセッターとゲッターの両方に対して。あなたの目的地は、アレイなかった場合

->set([qw/ key1 key2/], 'foo')  
->get([qw/ key1 key2/]) 

これは確かに、簡単にあなたの仕事になるだろう:

sub add_item { 
    my ($self, $hash) = @_; 
    $self->set([ $hash->{property}, $hash->{subproperty} ], $hash); 
} 

# get items works as is, just pass in an `ArrayRef` 
# ie, `->get([$property, $subproperty])` 

を、それは先がハッシュスロットよりも配列でも持つことになると、私は」あなたを想定しちょうどその特性の全く異なるヘルパーにそれを構築しなければなりません、push_to_array_or_create([$property, $subproperty], $value)。私はまだ上記の架空のgetヘルパーでそれを取得するだけです。 auto_derefタイプの機能はかなり悪い考えです。要するに

は、彼らがキーとして配列リファレンスを受け入れ、適切に動作するために、この文脈でsetgetを拡張考えるだろうか上のコア開発者に尋ねます。私はArrayRefキーのための有用なデフォルトがあるとは想像できません(私は規則的なストリンジェンシーが役に立たないと思います)。

関連する問題