类和对象方法
在 Perl 中,类(静态)和对象(实例)方法之间的差异不像其他语言那么强,但它仍然存在。
箭头运算符 ->
的左操作数成为要调用的方法的第一个参数。它可以是一个字符串:
# the first argument of new is string 'Point' in both cases
Point->new(...);
my $class = 'Point';
$class->new(...);
或对象引用:
# reference contained in $point is the first argument of polar_coordinates
my $point = Point->new(...);
my @coord = $point->polar_coordinates;
类方法只是期望它们的第一个参数是一个字符串,而对象方法是期望它们的第一个参数是一个对象引用的方法。
类方法通常不会对第一个参数执行任何操作,该参数只是类的名称。通常,它仅由 Perl 本身用于方法解析。因此,也可以为对象调用典型的类方法:
my $width = Point->canvas_width;
my $point = Point->new(...);
my $width = $point->canvas_width;
尽管允许使用此语法,但这通常会产生误导,因此最好避免使用它。
对象方法接收对象引用作为第一个参数,因此它们可以寻址对象数据(与类方法不同):
package Point;
use strict;
sub polar_coordinates {
my ($point) = @_;
my $x = $point->{x};
my $y = $point->{y};
return (sqrt($x * $x + $y * $y), atan2($y, $x));
}
1;
相同的方法可以跟踪两种情况:当它被称为类或对象方法时:
sub universal_method {
my $self = shift;
if (ref $self) {
# object logic
...
}
else {
# class logic
...
}
}