1

私は使ってMooseいます、多分それは重要です、多分それはそうではありません。

私のオブジェクトはとして入って来て、属性値を変数$eventに保存します:args

my $args = $event->args;

その値はたまたまハッシュなので、ハッシュにいくつかの処理を行います。具体的には、新しい要素を追加します。

$$args{id} = 4;

これが私が理解していないことです。$eventオブジェクトを確認するために戻ると、その新しいハッシュ要素が内部に保存されています。オブジェクトではなく、完全に異なる変数に設定したのに、なぜオブジェクトがそれを受け取るのですか?

4

3 に答える 3

2

ムースは関係ありません。$event->argsハッシュ参照を返すので、コピーと$event->argsは同じハッシュを指します。キーを追加すると追加されるため、両方の参照から表示されます。

argsこれを回避するために、 :によって返されるハッシュをコピーできます。

my $args = {%{$event->args}};

コピー後、新しいハッシュへの参照を取得するため$args、コピーへの参照になります。他のコード変更は必要ありません。

于 2013-01-06T21:45:27.583 に答える
2

あなたが少し進歩したいのではなく、

has 'args' => (
  is => 'rw',
  isa => 'HashRef',
);

またはあなたが通常行うことは何でも、あなたは次のようなことをすることができます

has '_args' => (
  is => 'ro',
  isa => 'HashRef',
  default => sub { +{} },
  traits => ['Hash'],
  handles => {
    args => 'kv', # or args => 'shallow_clone'
    set_arg => 'set',
    get_arg => 'get',
    clear_arg => 'delete',
  },
);

現在、argsは引き続きhashrefとしてオブジェクトに格納されていますが、という名前のプライベート属性に格納されており、_args他のメソッドを使用してアクセスします。たとえば、my %args = $event->args(使用した場合kv)またはmy $args = $event->args(使用shallow_cloneした場合は、hashrefを取得します。ただし、これはまだコピーです)$event->set_arg("foo" => "bar"); my $value = $event->get_arg("foo")など。これは厳密にオプションであり、理解できない場合はスキップする必要がありますが、より直交するインターフェイスを構築し、実装の詳細をユーザーから隠すのに役立ちます。

于 2013-01-07T00:04:10.910 に答える
1

返される$event->argsのはハッシュではなく、ハッシュ参照です。つまりargs、オブジェクト内の属性によっても示されるハッシュへのポインターです。あなたが言うとき$$args{id} = 4(または$args->{id} = 4同等のもの)、あなたはを$args指すハッシュの値を変更しています。そのハッシュへのポインタもオブジェクトに格納されるため、変更はそこにも反映されます。

オブジェクトに影響を与えずに変更したい場合$argsは、ハッシュのコピーを作成できます。

my %args = %{ $event->args };
于 2013-01-06T21:45:20.997 に答える