我正在使用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 in A和B中的use语句来“修复”这个问题,如下所示:
class A extends Exporter {
our @EXPORT = qw(f);
fun f {
print "yay,f!\n";
}
}
class B extends A {
use A;
fun g {
f();
}
}这看起来有点麻烦,但是如果A是在另一个文件中定义的,情况会变得更糟。然后,我必须在use A之外添加第二个B (require不会这样做),如下所示:
use A;
class B extends A {
use A;
fun g {
f();
}
}是否有办法使词法包含(导出的)函数更优雅地工作?
发布于 2014-08-28 19:32:52
首先,谢谢你使用Moops!:-)
其次,在测试和示例中命名类"B“可能是个坏主意。Perl附带了一个名为B的模块,Moops实际上使用它!
谈到你的实际问题,一般来说,你应该考虑的是method而不是fun。方法调用尊重继承;函数调用不尊重继承。
use Moops;
class AAA {
method f {
say "yay,f!";
}
}
class BBB extends AAA {
method g {
$self->f;
}
}
BBB->g;产出:
yay,f!如果您希望在AAA和BBB中都可以使用方便函数库,那么将这些方便函数分成一个单独的包:
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;与前面的示例相同的输出。
https://stackoverflow.com/questions/25547188
复制相似问题