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