首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数/子程序导入子类

将函数/子程序导入子类
EN

Stack Overflow用户
提问于 2014-08-28 10:59:52
回答 1查看 152关注 0票数 3

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

代码语言:javascript
复制
use Moops;

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

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

相反,这会产生:

代码语言:javascript
复制
Undefined subroutine &B::f called at static-functions-lexical-scope.pl line 11.

我可以通过继承Exporter in AB中的use语句来“修复”这个问题,如下所示:

代码语言:javascript
复制
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不会这样做),如下所示:

代码语言:javascript
复制
use  A;
class B extends A {
  use A;
  fun g {
    f();
  }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-28 19:32:52

首先,谢谢你使用Moops!:-)

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

谈到你的实际问题,一般来说,你应该考虑的是method而不是fun。方法调用尊重继承;函数调用不尊重继承。

代码语言:javascript
复制
use Moops;

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

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

BBB->g;

产出:

代码语言:javascript
复制
yay,f!

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

代码语言:javascript
复制
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;

产出:

代码语言:javascript
复制
yay,f!
yay,f!

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

代码语言:javascript
复制
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;

与前面的示例相同的输出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25547188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档