我有一個 Moose 物件,其屬性包含哈希參考。
package Foo;
use Moose;
has bar => (
is => 'ro',
isa => 'HashRef',
default => sub { {} },
};
在我的代碼中,我想要local內部的哈希參考$foo->bar。我知道我可以做到:
my $foo = Foo->new;
# ...
my %local_bar = ( asdf => 123 );
local $foo->{bar} = \%local_bar; # THIS LINE
call_to_something_that_needs_bar($foo);
for (keys %local_bar) {
...
}
但我不想這樣做1。是否有語法來本地化該結構而不進入內部?
1)我不想這樣做的原因是它$foo被包裹在一個Object::Destroyer實體中,所以當$foo->bar決議為 Foo 時,$foo->{bar}實際上最終在銷毀器實體中,并且$foo->{object}->{bar}是去哪里$foo->bar。帶有 的代碼local在生產代碼中,但$foo物件只是測驗中的 Object::Destroyer 實體。
uj5u.com熱心網友回復:
local備份一個變數,然后在堆疊上放置一個指令,當它從堆疊中彈出時恢復該變數。以下做類似的事情:
use Object::Destroyer qw( );
sub local_attribute {
my $obj = shift;
my $attr = shift;
my $val = shift; # Optional
my $backup = $obj->$attr();
my $guard = Object::Destroyer->new(
sub {
$obj->$attr( $backup )
}
);
$obj->$attr( $val );
return $guard;
}
my $guard = local_attribute( $foo, "bar", \%local_bar );
以上使用物件破壞來提供通用方法。您還可以使用特定于案例的例外處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495705.html
