gpt4 book ai didi

perl - 如何在 Perl OO 模块中实现调度表?

转载 作者:行者123 更新时间:2023-12-04 02:46:59 24 4
gpt4 key购买 nike

我想将 OO 包中的一些子组件放入一个数组中 - 也在包中 - 用作调度表。像这样的东西

package Blah::Blah;

use fields 'tests';

sub new {
my($class )= @_;

my $self = fields::new($class);

$self->{'tests'} = [
$self->_sub1
,$self->_sub2
];
return $self;
}

_sub1 { ... };
_sub2 { ... };

我不完全确定这个的语法?
$self->{'tests'} = [
$self->_sub1
,$self->_sub2
];

或者
$self->{'tests'} = [
\&{$self->_sub1}
,\&{$self->_sub2}
];

或者
$self->{'tests'} = [
\&{_sub1}
,\&{_sub2}
];

我似乎无法让它在 OO 包中工作,而它在程序方面非常简单,而且我还没有找到任何 OO 示例。

任何帮助深表感谢,
伊恩

最佳答案

你的 friend 是 can .如果存在,则返回对子例程的引用,否则返回 null。它甚至可以正确地沿着 OO 链向上走。

$self->{tests} = [
$self->can('_sub1'),
$self->can('_sub2'),
];

# later

for $tn (0..$#{$self->{tests}}) {
ok defined $self->{tests}[$tn], "Function $tn is available.";
}

# and later

my $ref = $self->{tests}[0];
$self->$ref(@args1);
$ref = $self->{tests}[1];
$self->$ref(@args2);

或者,感谢 this问题(恰好是 this 问题的变体),您可以直接调用它:
$self->${\$self->{tests}[0]}(@args1);
$self->${\$self->{tests}[1]}(@args1);

请注意 \给我们一个子引用的引用,然后它被 ${} 取消引用在 $self-> 之后.哇!

为了解决brain d foy提到的及时性问题,另一种方法是简单地将{test}本身设为一个子例程,它返回一个ref,然后你可以在你需要的时候得到它:
sub tests {
return [
$self->can('_sub1'),
$self->can('_sub2')
];
}

然后使用它:
for $tn (0..$#{$self->tests()}) {
...
}

当然,如果您无论如何都必须迭代引用,您不妨直接将引用传递出去:
for my $ref (0..$#{$self->tests()}) {
$self->$ref(@args);
}

关于perl - 如何在 Perl OO 模块中实现调度表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791833/

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