gpt4 book ai didi

perl - 在 Moose 子例程中,$meta 是如何进入 @_ 的?

转载 作者:行者123 更新时间:2023-12-04 13:10:11 25 4
gpt4 key购买 nike

chromatic's recent blog让我对 Moose 子程序感到好奇 has .我正在查看 Moose 源代码,并注意到 has子程序,有一个$meta@_ 解压的变量. $meta 在哪里来自?我已经开始涉足各种 Moose 和 Class::MOP 模块。在许多子例程中,似乎 $meta常见于 @_ 中的第一个参数,即使它没有作为参数专门传递给它。

编辑:这里是 has 的原始源代码子程序:

sub has {
my $meta = shift;
my $name = shift;

Moose->throw_error('Usage: has \'name\' => ( key => value, ... )')
if @_ % 2 == 1;

my %options = ( definition_context => Moose::Util::_caller_info(), @_ );
my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
$meta->add_attribute( $_, %options ) for @$attrs;
}

最佳答案

您正在寻找的特殊魔法在 Moose::Exporter .你得到 has此代码中通过 Moose.pm 的方法:

Moose::Exporter->setup_import_methods(
with_meta => [
qw( extends with has before after around override augment )
],
as_is => [
qw( super inner ),
\&Carp::confess,
\&Scalar::Util::blessed,
],
);

注意 setup_import_methods 的“with_meta”选项-- 它以确保传递的第一个参数是元类对象的方式将这些方法导入调用者的命名空间。

扩展 Moose 的各种 MooseX 模块使用 Moose::Exporter 将新符号导入调用者的命名空间。您可以从 Moose::Cookbook::Extending::Recipe1 开始在食谱中阅读有关此过程的更多信息。 .

关于perl - 在 Moose 子例程中,$meta 是如何进入 @_ 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com