Perl 将函数/子例程导入子类

Perl 将函数/子例程导入子类,perl,moops,Perl,Moops,我正在使用,我希望这样的东西能起作用: 使用Moops; 甲级{ 乐趣{ 打印“耶,f!\n”; } } B类扩展了A类{ 芬格{ f(); } } B->g()#应该打印“耶,f!” 相反,这会产生: 在static-functions-lexical-scope.pl第11行调用了未定义的子例程&B::f。 我可以通过继承A中的语句和B中的语句来“修复”此问题,如下所示: A类扩展导出器{ 我们的@EXPORT=qw(f); 乐趣{ 打印“耶,f!\n”; } } B类扩展了A类{ 使用

我正在使用,我希望这样的东西能起作用:

使用Moops;
甲级{
乐趣{
打印“耶,f!\n”;
}
}
B类扩展了A类{
芬格{
f();
}
}
B->g()#应该打印“耶,f!”
相反,这会产生:

在static-functions-lexical-scope.pl第11行调用了未定义的子例程&B::f。
我可以通过继承
A
中的语句和
B
中的语句来“修复”此问题,如下所示:

A类扩展导出器{
我们的@EXPORT=qw(f);
乐趣{
打印“耶,f!\n”;
}
}
B类扩展了A类{
使用;
芬格{
f();
}
}
这似乎有点笨拙,但如果在另一个文件中定义了
a
,情况会变得更糟。然后我必须在
B
之外添加第二个
使用a
要求
不行),如下所示:

使用密码;
B类扩展了A类{
使用;
芬格{
f();
}
}

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

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

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

说到你的实际问题,一般来说,在课堂上,你应该考虑
方法
,而不是
乐趣
。方法调用尊重继承;函数调用不会

use Moops;

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

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

BBB->g;
产出:

yay,f!
yay,f!
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!
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;

输出与前一个示例相同。

是的,您的权利。也许我的例子太简单了,无法表达我的意图。我希望基类提供不访问对象状态的“便利函数”,我(我是懒惰的,我)希望保存一些输入…我添加了第二个示例,展示了为这两个类提供便利函数的一种方法。