面向对象的Perl中的包,模块和类有什么区别?

joe*_*joe 18 oop perl module

面向对象的Perl中的包,模块和类有什么区别?

Ken*_*ric 29

模块是单个文件,是提供代码的.pm文件.这可能不是包,单个包或多个包.模块并不真正关心其中的内容,因此它可以是将自身插入到同一名称空间中的代码,也可以是库中更传统的子程序集,或者定义Perl的类概念.

包(也称为命名空间)包含自己的变量和子例程.这是一种隔离程序不同部分的方法.您创建包并将代码放入其中:

package SomePackage;

sub some_subroutine { ... } # really SomePackage::some_subroutine
Run Code Online (Sandbox Code Playgroud)

您加载模块以获取对包的访问权限:

use SomePackage; # read and compile the module file

SomePackage::some_subroutine( ... );
Run Code Online (Sandbox Code Playgroud)

Perl类是一个包及其相关行为.类中的方法只是普通的子例程,但是当我们将子例程视为方法时,第一个参数是调用方法的东西(包名称或对象,也称为引用对象):

package SomeClass;

sub class_method { my( $class, @args ) = @_; ... }
sub instance_method { my( $self, @args ) = @_; ... }
Run Code Online (Sandbox Code Playgroud)

由于该类只是一个类似于任何其他包的包,并且可能存在于一个模块中,因此您可以通过以下方式访问它use:

 use SomeClass;

 my $i = SomeClass->class_method( ... ); 
Run Code Online (Sandbox Code Playgroud)

OO箭头语法做了一些特殊的事情让some_method子程序知道它被称为方法.Perl将引用(SomeClass在本例中为)作为第一个参数.此外,在使用OO语法时,Perl知道使用其继承功能.

用' - >'调用的方法将referent作为方法的第一个参数,所以这个调用:

  SomeClass->new('world'); 
Run Code Online (Sandbox Code Playgroud)

在语法上是if你用类名作为第一个参数调用它:

  SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way
Run Code Online (Sandbox Code Playgroud)

对于对象也是如此.当一个对象是指示对象时:

my $i = SomeClass->new(); 
$i->bar( 'world'); 
Run Code Online (Sandbox Code Playgroud)

该对象是第一个参数作为方法:

SomeClass::bar($i, 'world'); 
Run Code Online (Sandbox Code Playgroud)

  • 包不是范围.它们是词法范围的,但不定义范围. (5认同)
  • Perl没有课程.Perl的OOP模型使用引用,子例程和包来做人们期望类做的事情,但是没有什么是类.由于这个原因,您没有类数据,并且必须使用文件范围内的词法变量为每个模块使用一个包伪造它. (3认同)
  • Perl类不需要有构造函数.您只需要创建实例,而您不必这样做. (3认同)

bri*_*foy 12

Perl没有课程.它具有您更改的名称空间package.有关Perl OOP的完整详细信息,请参阅中间Perl面向对象的Perl.您还可以查看perltootperlboot文档.简而言之,Perl伪造了人们期望的"真实"类与包,普通子例程和引用.

模块是包含在文件中的可分发代码段.见perlmod.


我在The Effective Perler的帖子中详细说明了这个,找一个模块的发布经理.我没有进入OO的东西,但我谈到了"模块"的其他术语.