【问题标题】:What is the difference between package, module and class in object oriented Perl?面向对象的 Perl 中的包、模块和类有什么区别?
【发布时间】:2009-07-17 15:09:19
【问题描述】:

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

【问题讨论】:

  • 在您提出这些问题之前,请先尝试阅读 Perl 文档。如果您不理解所阅读的内容,请提出相关问题。
  • 是什么让你如此确定他没有 RTFM?
  • @spoulson:看看他的问题历史。这不是一次性的。
  • 此外,Perl 文档几乎涵盖了您想了解的有关 Perl 的所有信息。
  • @bryan d foy:不过,他/她的大部分问题都是很好的常见问题解答。

标签: perl oop module


【解决方案1】:

模块是一个单独的文件,一个提供代码的 .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 知道要使用其继承特性。

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

  SomeClass->new('world'); 

在语法上与您使用类名作为第一个参数来调用它一样:

  SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way

对象也一样。当一个对象是所指对象时:

my $i = SomeClass->new(); 
$i->bar( 'world'); 

对象是方法的第一个参数:

SomeClass::bar($i, 'world'); 

【讨论】:

  • 说 Perl
  • 包不是作用域。它们是词法范围的,但没有定义范围。
  • Perl 没有类。 Perl 的 OOP 模型使用引用、子例程和包来做人们期望类做的事情,但没有什么是类。由于这个原因,您没有类数据,并且必须使用每个模块一个包来伪造它,并在文件范围内使用词法变量。
  • Perl 类不需要有构造函数。您只需要创建实例,而不必这样做。
  • @brian d foy:更清楚地说:当前包的概念是词法范围的,但包不是。
【解决方案2】:

Perl 没有类。它具有您使用package 更改的命名空间。有关 Perl OOP 的完整详细信息,请参阅 Intermediate PerlObject Oriented Perl。您还可以查看perltootperlboot 文档。简而言之,Perl 用包、普通子例程和引用伪造了人们期望的“真实”类。

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


我在The Effective PerlerFind a module's release managers 的帖子中对此进行了详细说明。我不涉及 OO 的东西,但我谈论的是围绕“模块”的其他术语。

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多