2

就 Perl OO 而言,究竟做了->什么?

例如,我打电话给 main:

$result = a::b->mymethod( );

在我定义的包中mymethod(),我使用以下内容:

    my( $class ) = @_;

总的来说,我显然没有将任何参数传递给mymethod(),那么$class参数来自哪里?有没有人对此有一个很好的解释或解释这个的文件?

4

2 回答 2

8

perlobj 文档的“方法调用”部分解释了这一点。增加的重点是我的。

方法调用

由于各种历史原因和其他原因,Perl 提供了两种等效的方法来编写方法调用。更简单和更常见的方法是使用箭头符号:

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

您应该已经熟悉->操作符与引用的用法。事实上,由于$fred上​​面是对对象的引用,您可以将方法调用视为另一种形式的取消引用。

箭头左侧的任何内容,无论是引用还是类名,都将作为其第一个参数传递给方法子例程。所以上面的代码大多等价于:

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

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

于 2012-05-28T12:05:15.860 回答
3

声明:$result = a:b->mymethod( );由于使用了单个:.
正确的形式是:$result = a::b->mymethod( );

->称为箭头运算符。它意味着一个方法调用。对于方法调用,对象作为第一个参数隐式传递,该参数可通过@_(与任何其他参数一样)使用,除了它是第一个元素。

箭头运算符区分函数/子例程调用和方法调用。

例子:

Foo::Bar->method();    # Method call
Foo::Bar::function();  # Function/subroutine call

对于函数/子例程调用,不传递隐式参数。

#!/usr/bin/env perl

use strict;
use warnings;

package Foo::Bar;

sub baz {
    print 'Arguments: ', scalar @_, "\n";
}

package main;

Foo::Bar::baz;
Foo::Bar->baz;

相关文件:

于 2012-05-28T11:51:48.470 回答