【发布时间】:2020-01-07 10:56:50
【问题描述】:
我希望能够在类中动态“注入”方法,类似于 Mojolicious 助手的情况。像这样的:
my $s = SomeThing->new;
$s->helper(do_this => sub {
my $self = shift;
$foo = shift;
});
$s->do_this('bar');
我已经取得了一些进展,但我希望被注入的 subs 在它们注入的类的命名空间中运行,而不是在 main 中运行。换句话说,目前的工作方式如下:
$s->do_this('bar');
print 'in main: ', $foo;
这会打印“bar” - 我不希望它打印,而我希望 this
print 'in SomeThing: ', $SomeThing::foo;
改为打印“bar”
虽然这可行,但对我来说似乎很笨重
$s->helper(do_this => sub {
my $self = shift;
${(ref $self) . '::foo'} = shift;
});
$s->do_this('foo');
print 'in SomeThing: ', $SomeThing::foo; # now this prints "foo"
发生这一切的包如下所示:
package SomeThing {
use Mojo::Base -base;
use Carp;
sub helper {
my $self = shift;
my $name = shift || croak "The helper name is required";
my $sub = shift || sub {};
my $namespace = __PACKAGE__;
no strict 'refs';
{
*{"$namespace\::$name"} = $sub
}
}
};
有没有办法做到这一点?我怀疑我会搞砸严格性真的很糟糕 - 但我还不想放弃(这将是一个很好的学习技巧)。
【问题讨论】:
-
在您的用例中是否可以使用
eval从字符串生成代码? -
提示:Re "
*{"$namespace\::$name"} = $sub",*$name = $sub在这里就足够了。 -
@pmqs 我想尽可能避免这种情况
-
我不清楚您是否希望注入的方法仅适用于该实例或任何实例
-
他们说的是“包”和“类”,而不是“对象”。
标签: perl mojolicious