7

来自(在这个出色的答案perldoc perlobj中引用):

my $fred = Critter->find("Fred");
$fred->display("Height", "Weight");

...上面的代码主要相当于:

my $fred = Critter::find("Critter", "Fred");
Critter::display($fred, "Height", "Weight");

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

4

1 回答 1

15

说 Critter 是一个子类,它没有定义finddisplay- 或两者!正如 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);

输出:

SuperCritter 显示在 ./call-demo 第 14 行。
SuperCritter 显示在 ./call-demo 第 15 行。
在 ./call-demo 第 16 行调用了未定义的子例程 &SuperCritter::display。
于 2012-05-28T13:07:49.780 回答