📜  Perl 编程中的通用包

📅  最后修改于: 2022-05-13 01:54:50.095000             🧑  作者: Mango

Perl 编程中的通用包

UNIVERSAL是 Perl 5 中的内置包。它也可以被认为是派生类可以隐式继承或覆盖的基类。它提供了几种默认方法,如isa()can()VERSION()DOES() 。 UNIVERSAL 类不能显示在包的@ISA变量中。其他方法也可以通过 Perl 或 XS 代码添加到 UNIVERSAL 类中。无需在代码中包含“ use UNIVERSAL ”语句即可在程序中使用上述方法。

版本()方法

它返回合适的类或包的 $VERSION 变量的值。此方法可以将版本号作为可选参数。如果查询到的 $VERSION 不大于或等于参数,该方法会抛出异常。

例子:
让我们考虑一个 2.0 版本的模块 Dog

use 5.010;
package Dog 2.0;
use strict;
use warnings;
  
# constructor
sub new
{
    # the package name 'Dog' is in the default array @_
    # shift will take package name 'Dog' 
    # and assign it to variable 'class'
    my $class = shift;
      
    # object
    my $self = {
        'name' => shift,
        'breed' => shift
    };
      
    # blessing self to be object in class
    bless $self, $class;
      
    # returning object from constructor
    return $self;
}
  
my $d = new Dog('Sammy','Pug');
  
say Dog->VERSION();
say $d->VERSION();
say $d->VERSION(0.0);
say $d->VERSION(1.5);
say $d->VERSION(3.0);    # EXCEPTION

输出:

2.0
2.0
2.0
2.0
Dog version 3 required--this is only version 2.0 at /home/4c09f6973dc56e8a558b8be499a040bb.pl line 32.

DOES() 方法

DOES()方法检查类或对象是否执行特定角色。当角色名称传递给此方法时,如果它执行指定的角色,则返回 true(1),否则返回 false(0)。角色可以被认为是一个类所表现的行为的集合。

例子:
让我们考虑模块/类狗和动物

use 5.010;
package Animal;  
  
sub new
{
    my $type = shift;           
    my $self = {};               
    return bless $self, $type;    
}
  
sub MyMethod 
{
   print "Animal::MyMethod called!\n";
}
  
# class Dog    
package Dog;   
  
# class Dog inherits from class Animal
@ISA = qw(Animal);    
  
sub new
{
    my $type = shift;            
    my $self = Animal->new;     
    return bless $self, $type;  
}
sub MyMethod
{
    my $self = shift;
    
    $self->SUPER::MyMethod();
}
   
# Driver Code
package main;      
$myObject = Animal->new();
$myObject2 = Dog->new();
  
# Basic DOES() usage
say Dog->DOES('Animal');
say $myObject->DOES('Animal');
say $myObject2->DOES('Dog');

输出:

1
1
1

can() 方法

can()方法接受方法名作为字符串。它返回对实现此方法的现有函数的引用,否则返回 false 值。可以在类、对象或包上调用此方法。如果 can($classname) 返回 true,则表示存在名称为 $classname 的类。这个方法只检查一个类的存在,不评论它的可用性。

例子:
让我们考虑一个带有名为 bark 的方法的 Dog 类,可以按如下方式引用该方法:

use 5.010;
use strict;
use warnings;
  
{ 
    package Animal; 
    sub new 
    { 
        bless({}, 
        $_[0]) 
          
    }
}
  
{ 
    package Dog; 
    our @ISA = qw(Animal); 
    sub dog { 1 } 
}
  
# objects
my $dog = Dog->new;
my $animal = Animal->new;
  
# Basic can() usage
say $animal->can('dog');  # false
say $dog->can('dog');  # true

输出:

Use of uninitialized value in say at /home/fdfdd52de0b7348de191b3d9be3cb44f.pl line 11.
CODE(0x1fc3168)

can()也可用于检查包是否已成功实现特定函数或方法。

isa() 方法

isa()方法接受类的名称或内置类型的名称作为字符串。它可以在类方法、实例方法或对象上调用。如果指定的类或对象是从包派生的,或者它是对给定类型的祝福引用,则返回 true。

例子:
假设 $doggy 是一个对象(继承自 Animal 类的 Dog 类的哈希引用):

use 5.010;
use strict;
use warnings;
  
{ 
    package Animal; 
    sub new
    { 
        bless({},
        $_[0]) 
    } 
}
  
{ 
    package Dog; 
    our @ISA = qw(Animal); 
    sub dog { 1 } 
}
  
# objects
my $animal = Animal->new;
my $dog = Dog->new;
  
# basic isa() usage 
say $animal->isa('Animal');  # true
say $dog->isa('Animal');  # true

输出:

1
1