在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 ... } }