如何确定在 Moose 构造函数中调用它的上下文?
How to determine, in a Moose constructor, what context it was called in?
假设我们有一只驼鹿 class 像这样:
package My::Test ;
use Moose ;
$\="\n";
sub BUILDARGS {
my ($pkg,%args) = @_ ;
print defined wantarray ? 'BUILDARGS: SCALAR':'BUILDARGS: VOID' ;
return \%args ;
}
sub BUILD {
print defined wantarray ? 'BUILD: SCALAR':'BUILD: VOID' ;
my ( $self, $args ) = @_ ;
print '---' ;
}
1;
在 SCALAR 和 VOID 上下文中实例化 class 我总是得到相同的输出:
#!/usr/bin/perl
use Moose ;
use My::Test ;
# Scalar ctx
my $instance = My::Test->new ;
# Void ctx
My::Test->new ;
输出:
BUILDARGS: SCALAR
BUILD: VOID
---
BUILDARGS: SCALAR
BUILD: VOID
我能够在一个简单的包中获取包含 Moose class 实例创建的上下文,并将上下文作为构造函数属性传递,如下所示:
package My::Wrapper ;
use My::Test ;
sub new {
my ( $class , %args ) = @_ ;
return My::Test->new(%args , ctx => defined wantarray ? 'scalar':'void') ;
}
1 ;
但我想知道是否有更简洁的方法。
Moose 为您创建构造函数(参见 here)。上下文不会传播到 BUILDARGS 或 BUILD。
你可以用 Moose 方式包裹 new
,不过:
around new => sub {
my ($orig, $self) = splice @_, 0, 2;
warn defined wantarray ? 'other' : 'void';
$self->$orig(@_)
};
假设我们有一只驼鹿 class 像这样:
package My::Test ;
use Moose ;
$\="\n";
sub BUILDARGS {
my ($pkg,%args) = @_ ;
print defined wantarray ? 'BUILDARGS: SCALAR':'BUILDARGS: VOID' ;
return \%args ;
}
sub BUILD {
print defined wantarray ? 'BUILD: SCALAR':'BUILD: VOID' ;
my ( $self, $args ) = @_ ;
print '---' ;
}
1;
在 SCALAR 和 VOID 上下文中实例化 class 我总是得到相同的输出:
#!/usr/bin/perl
use Moose ;
use My::Test ;
# Scalar ctx
my $instance = My::Test->new ;
# Void ctx
My::Test->new ;
输出:
BUILDARGS: SCALAR
BUILD: VOID
---
BUILDARGS: SCALAR
BUILD: VOID
我能够在一个简单的包中获取包含 Moose class 实例创建的上下文,并将上下文作为构造函数属性传递,如下所示:
package My::Wrapper ;
use My::Test ;
sub new {
my ( $class , %args ) = @_ ;
return My::Test->new(%args , ctx => defined wantarray ? 'scalar':'void') ;
}
1 ;
但我想知道是否有更简洁的方法。
Moose 为您创建构造函数(参见 here)。上下文不会传播到 BUILDARGS 或 BUILD。
你可以用 Moose 方式包裹 new
,不过:
around new => sub {
my ($orig, $self) = splice @_, 0, 2;
warn defined wantarray ? 'other' : 'void';
$self->$orig(@_)
};