Perl OO方法调用第一个参数值( - >)

时间:2012-05-28 11:40:05

标签: perl

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

例如,我打电话给主:

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

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

    my( $class ) = @_;

在main中,我显然没有向mymethod()传递任何参数,那么$class参数来自何处?有没有人对此有一个很好的解释或解释这个的文件?

2 个答案:

答案 0 :(得分:8)

“Method Invocation” section of the perlobj documentation解释道。增加的重点是我的。

  

方法调用

     

出于各种历史和其他原因,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开始在该包的任何基类中查找它,依此类推。

答案 1 :(得分:2)

声明:$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;

相关文件: