这两个语句在perl中总是相同的吗?
有人知道它们是否相同吗?否。->运算符意味着调用引用(在本例中为对象引用),它将查找SUPER方法,而不是超基类 下面是显示它的代码:这两个语句在perl中总是相同的吗?,perl,oop,Perl,Oop,有人知道它们是否相同吗?否。->运算符意味着调用引用(在本例中为对象引用),它将查找SUPER方法,而不是超基类 下面是显示它的代码: $obj->SUPER::promote(); $obj->SUPER->promote(); 运行它,您将获得: #!/usr/bin/perl -w package MyOBJ; use strict; use warnings; use Data::Dumper; sub new { my ($class) = @_;
$obj->SUPER::promote();
$obj->SUPER->promote();
运行它,您将获得:
#!/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();
当您将最后一行更改为使用->而不是:时,您会得到:
$VAR1 = bless( {}, 'MyOBJ::Sub' );
从“perldoc perlop”手册
箭头运算符
如果右侧是“[…]”、“{…}”或“(…)”下标,则左侧必须分别是对数组、哈希或子例程的硬引用或符号引用
否则,右侧是一个方法名或一个包含方法名或子例程引用的简单标量变量,左侧必须是一个对象(受祝福的引用)或类名(即包名)
由于左侧既不是对象引用,也不是类名(SUPER是一种为多态性定义的语言),它被视为一种方法,而这种方法并不存在,因此会出现错误。您可以自己尝试并找出答案。:)为什么在使用
->
时它会寻找这个方法,原因是什么?我在我的答案中附加了一些更多的信息,这些信息是从perl手册中复制的。希望能为您进一步解释。
Can't locate object method "SUPER" via package "MyOBJ" at test.pl line 45.