这两个语句在perl中是否总是相同的?

com*_*fan 7 oop perl

$obj->SUPER::promote();

$obj->SUPER->promote();
Run Code Online (Sandbox Code Playgroud)

谁知道他们是否一样?

Cor*_*son 22

不.- >运算符意味着调用引用(在本例中为对象引用),它将查找SUPER 方法,而不是超级基类.

这是代码来显示它:

#!/usr/bin/perl -w

package MyOBJ;

use strict;
use warnings;

use Data::Dumper;

sub new {
    my ($class) = @_;

    my $self = {};

    bless $self, $class;

    return $self;
}

sub promote {
    my ($self) = @_;

    print Dumper($self);

}

1;

package MyOBJ::Sub;

use strict;
use warnings;

use base 'MyOBJ';

1;

use strict;
use warnings;

my $obj = MyOBJ::Sub->new();

$obj->SUPER::promote();
Run Code Online (Sandbox Code Playgroud)

运行它,你会得到:

$VAR1 = bless( {}, 'MyOBJ::Sub' );
Run Code Online (Sandbox Code Playgroud)

当你改变最后一行使用- >而不是::你得到:

Can't locate object method "SUPER" via package "MyOBJ" at test.pl line 45.
Run Code Online (Sandbox Code Playgroud)

来自"perldoc perlop"手册

箭头操作员

如果右侧是"[...]","{...}"或"(...)"下标,则左侧必须是对数组的硬引用或符号引用,分别是散列或子程序.

否则,右侧是方法名称或包含方法名称或子例程引用的简单标量变量,左侧必须是对象(有福的引用)或类名(即包名)

由于左侧既不是对象引用也不是类名(SUPER是用于多态的语言定义的裸字),因此它被视为一种方法,它不存在,因此就是错误.