Perl:静态方法与包方法

标签 perl static package

我需要创建一个可供其他开发人员使用的包。 实现静态方法的最佳方式是什么? 对于静态(类)方法,我必须期待第一个参数 $class,并且方法必须作为类方法调用:

My::Package->Sub1();

另一方面,我可以编写一个“常规”包子例程(不需要 $class 参数),它将完全执行相同的操作,但需要以不同的方式调用

My::Package::Sub1();

所以,从业务功能的角度来看基本上没有什么区别(至少我没有看到它,除了通过第一个参数提供包名称可用性),但是有两种不同的实现和调用方式。有点令人困惑。 我应该使用哪种方式以及何时使用?有什么规则吗? 另外,我应该检查方法是否按我的预期调用(静态与包)?

最佳答案

首先,一个功能点:如果创建一个继承自My::Package的第二类,Child::Class::Sub1()将是未定义的,如果 Sub1 被编写为非 OO 子例程,则 Child::Class->Sub1() 将忽略它是从 Child::调用的事实类

因此,为了使用您的模块的程序员,您需要使包/类中的所有子例程响应一致的调用结构/方法。您的模块应该是一个子例程/函数的,或者是一个充满方法的。如果其中一部分是面向对象的,那么就全部面向对象。可以创建子例程以混合模式运行,但这会使代码不必要地复杂化,并且在 CPAN 上似乎已经过时了。

现在,如果确实没有理由区分 My::Package->Sub1()Child::Class->Sub1(),那么您可以请随意忽略您将传递的隐式类名参数。这并不意味着您不应该期望该参数,也不意味着您应该鼓励在 OO 模块中使用非 OO 调用格式。

关于Perl:静态方法与包方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923277/

相关文章:

ios - 无法访问 iOS 静态库中资源包文件中的 Storyboard

java - 为什么最佳实践因 OOP 中的静态类而异?

Go库包名

java - maven打包时可以强制svn更新吗

perl - Perl 的触发器操作符有问题吗?它具有全局状态,我该如何重置它?

c++ - Perl:IPC::Shareable 和 SWIG'ed C++ 对象不一致

perl - 在 Perl 中迭代哈希

linux - 我怎样才能用 Perl 杀死整个进程树?

c++ - 防止跳过静态变量初始化

package - Ocaml - 尝试编译时出现语法错误