gpt4 book ai didi

perl - 将函数/子程序导入子类

转载 作者:行者123 更新时间:2023-12-01 04:44:14 24 4
gpt4 key购买 nike

我正在使用 Moops我想要这样的东西工作:

use Moops;

class A {
fun f {
print "yay,f!\n";
}
}

class B extends A {
fun g {
f();
}
}
B->g(); # should print 'yay, f!'

相反,这会产生:

Undefined subroutine &B::f called at static-functions-lexical-scope.pl line 11.

我可以通过继承 Exporter 来“修复”这个问题在 AuseB 中的语句如下:

class A extends Exporter {
our @EXPORT = qw(f);
fun f {
print "yay,f!\n";
}
}

class B extends A {
use A;
fun g {
f();
}
}

这看起来有点笨拙,但如果 A 定义在另一个文件中,情况会变得更糟。然后我必须在 B 之外添加第二个 use A(require 不会),如下所示:

use  A;
class B extends A {
use A;
fun g {
f();
}
}

有没有办法让词法包含(导出的)函数更优雅地工作?

最佳答案

首先,感谢您使用 Moops! :-)

其次,在测试和示例中将类命名为“B”可能不是一个好主意。有一个名为 B 的模块Perl 附带的,而 Moops 实际上使用它!

对于您的实际问题,一般来说,对于类,您应该考虑方法 而不是乐趣。方法调用尊重继承;函数调用不会。

use Moops;

class AAA {
method f {
say "yay,f!";
}
}

class BBB extends AAA {
method g {
$self->f;
}
}

BBB->g;

输出:

yay,f!

如果您希望在 AAABBB 中都可以使用便利函数库,那么,将这些便利函数拆分到一个单独的包中:

use Moops;

namespace MyUtils {
use Exporter::Shiny qw( f );
fun f {
say "yay,f!";
}
}

class AAA {
use MyUtils -all;
method m1 {
f();
}
}

class BBB extends AAA {
use MyUtils -all;
method m2 {
f();
}
}

BBB->m1;
BBB->m2;

输出:

yay,f!
yay,f!

您甚至可以更进一步,从内部扩展 Moops。以下示例定义了一个可以添加到类中的 :utils 特征:

use Moops;

namespace MyUtils {
use Exporter::Shiny qw( f );
fun f {
say "yay,f!";
}
}

role Moops::TraitFor::Keyword::utils {
around generate_package_setup {
return (
$self->$next(@_),
'use MyUtils -all;',
);
}
}

class AAA :utils {
method m1 {
f();
}
}

class BBB extends AAA :utils {
method m2 {
f();
}
}

BBB->m1;
BBB->m2;

与前面示例相同的输出。

关于perl - 将函数/子程序导入子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25547188/

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