就Perl OO而言,->
究竟做了什么?
例如,我打电话给主:
$result = a::b->mymethod( );
在我定义mymethod()
的包中,我使用以下内容:
my( $class ) = @_;
在main中,我显然没有向mymethod()
传递任何参数,那么$class
参数来自何处?有没有人对此有一个很好的解释或解释这个的文件?
答案 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;
相关文件:
perldoc perlobj
- Perl Objects perldoc perlboot
- 初学者的面向对象教程perldoc perltoot
- Tom的面向对象的perl教程