類和物件方法

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