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 は、定義されていないサブクラスであるとしfindましょdisplayう。perlobj のドキュメントで説明されているように、ハードワイヤード サブ呼び出しはメソッド ルックアップを実行しないため、対応は 1 対 1 ではありません。

Perl はサブルーチンがどのパッケージに入っているかをどうやって知るのですか? 矢印の左側を見ると、パッケージ名またはオブジェクトへの参照、つまりパッケージに祝福されたものでなければなりません。いずれにせよ、それは Perl が探し始めるパッケージです。そのパッケージにその名前のサブルーチンがない場合、Perl はそのパッケージの基本クラスでそれを探し始めます。

サブルーチンを使用すると、それが静的にどこにあるかを正確に知る必要があります。そうしないと、プログラムが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);

出力:

./call-demo 14 行目の SuperCritter 表示。
./call-demo 15 行目の SuperCritter 表示。
未定義のサブルーチン &SuperCritter::display が ./call-demo 行 16 で呼び出されました。
于 2012-05-28T13:07:49.780 に答える