gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:19:50 25 4
gpt4 key购买 nike

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

最佳答案

模块是一个单独的文件,一个提供代码的 .pm 文件。这可能是没有包、单个包或多个包。模块并不真正关心其中的内容,因此它可以是将自身插入同一 namespace 的代码、库中更传统的子例程集或定义 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 中的包、模块和类有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1143874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com