【问题标题】:Perl OO method call first argument value (->)Perl OO 方法调用第一个参数值 (->)
【发布时间】:2012-05-28 11:40:04
【问题描述】:

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

例如我打电话给main:

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

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

    my( $class ) = @_;

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

【问题讨论】:

标签: perl


【解决方案1】:

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

方法调用

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

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

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

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

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

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

【讨论】:

  • 感谢文档参考!
【解决方案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;

相关文件:

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 2013-01-29
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多