面向对象Perl中的包,模块和类有什么区别?
答案 0 :(得分:29)
模块是单个文件,提供代码的 .pm 文件。这可能不是包,单个包或多个包。模块并不真正关心其中的内容,因此它可以是将自身插入到同一名称空间中的代码,也可以是库中更传统的子程序集,或者定义Perl对类的概念。
包(也称为命名空间)包含自己的变量和子例程。这是一种隔离程序不同部分的方法。您创建包并将代码放入其中:
package SomePackage;
sub some_subroutine { ... } # really SomePackage::some_subroutine
您加载模块以访问包:
use SomePackage; # read and compile the module file
SomePackage::some_subroutine( ... );
Perl类是一个包及其相关行为。类中的方法只是普通的子例程,但是当我们将子例程视为方法时,第一个参数是调用方法的东西(包名称或对象,也称为引用对象):
package SomeClass;
sub class_method { my( $class, @args ) = @_; ... }
sub instance_method { my( $self, @args ) = @_; ... }
由于该类只是一个类似于任何其他包的包,并且可能位于模块中,因此您可以使用use
以相同的方式访问它:
use SomeClass;
my $i = SomeClass->class_method( ... );
OO箭头语法做了一些特殊的事情让some_method
子例程知道它被称为方法。 Perl将引用(本例中为SomeClass
)作为第一个参数。此外,在使用OO语法时,Perl知道使用其继承功能。
使用' - >'调用的方法将referent作为方法的第一个参数,所以这个调用:
SomeClass->new('world');
在语法上是if你用类名作为第一个参数调用它:
SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way
对于对象也是如此。当一个对象是指示对象时:
my $i = SomeClass->new();
$i->bar( 'world');
该对象是第一个参数作为方法:
SomeClass::bar($i, 'world');
答案 1 :(得分:12)
Perl没有课程。它具有您使用package
更改的名称空间。有关Perl OOP的完整详细信息,请参阅 Intermediate Perl 或面向对象的Perl 。您还可以查看perltoot和perlboot文档。简而言之,Perl伪造了人们期望的“真实”类与包,普通子例程和引用。
模块是文件中包含的可分发代码段。请参阅perlmod。
我在The Effective Perler,Find a module's release managers的帖子中详细说明了这一点。我没有进入OO的东西,但我谈论围绕“模块”的其他术语。