就 Perl OO 而言,究竟做了->
什么?
例如,我打电话给 main:
$result = a::b->mymethod( );
在我定义的包中mymethod()
,我使用以下内容:
my( $class ) = @_;
总的来说,我显然没有将任何参数传递给mymethod()
,那么$class
参数来自哪里?有没有人对此有一个很好的解释或解释这个的文件?
就 Perl OO 而言,究竟做了->
什么?
例如,我打电话给 main:
$result = a::b->mymethod( );
在我定义的包中mymethod()
,我使用以下内容:
my( $class ) = @_;
总的来说,我显然没有将任何参数传递给mymethod()
,那么$class
参数来自哪里?有没有人对此有一个很好的解释或解释这个的文件?
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 开始在那个包的任何基类中寻找它,以此类推。
声明:$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 对象perldoc perlboot
- 初学者的面向对象教程perldoc perltoot
- Tom 的 perl 面向对象教程