通过" - >"与传递类/对象作为第一个参数调用方法之间的区别究竟是什么?

DVK*_*DVK 7 oop perl object

perldoc perlobj(引用这个优秀的答案):

my $fred = Critter->find("Fred");
$fred->display("Height", "Weight");
Run Code Online (Sandbox Code Playgroud)

......以上代码大致相当于:

my $fred = Critter::find("Critter", "Fred");
Critter::display($fred, "Height", "Weight");
Run Code Online (Sandbox Code Playgroud)

究竟有什么区别,除了错误检查以确保第一个参数是受祝福的对象或有效的类名?例如,为什么它大部分但不完全相同?

Gre*_*con 15

说Critter是一个没有定义findor display或者两者的子类!这种对应关系不是一对一的,因为perlobj文档解释说,硬连线子调用不执行方法查找.

Perl如何知道子程序所在的包?通过查看箭头的左侧,它必须是包名称或对象的引用,已经祝福包裹的东西.无论哪种方式,这都是Perl开始寻找的包.如果该包没有具有该名称的子例程,则Perl开始在该包的任何基类中查找它,依此类推.

使用sub,您必须确切地知道它的静态位置,或者您的程序die.要调用方法,您只需指定从哪里开始搜索它.

例如:

#! /usr/bin/env perl

package Critter;
sub new { bless {}, shift }
sub display { ref($_[0]) . " display" }

package SuperCritter;
@SuperCritter::ISA = qw/ Critter /;

package main;
my $super = SuperCritter->new;

# one of these things is not like the other
warn $super->display;
warn Critter::display($super);
warn SuperCritter::display($super);
Run Code Online (Sandbox Code Playgroud)

输出:

SuperCritter display at ./call-demo line 14.
SuperCritter display at ./call-demo line 15.
Undefined subroutine &SuperCritter::display called at ./call-demo line 16.

  • 一个很好的答案,我赞成,但它设法证明问题的答案主要是继承,而不使用继承一词.:) (2认同)