2017-04-06 15 views
0

对我来说,Perl引用是一件很难理解的事情。在阅读使用对象方法的类OO脚本时,我从来没有看到用作参考的对象。即使对于大对象,也可以从被用作参考而不是被复制到子程序(方法)中受益。Perl方法和通过引用

PerlMaven说:

$p->a_method($value); 

在幕后,Perl的运行

a_method($p, $value); 

但如果$p是巨大的物体,也不会想要把它作为一个参考?

a_method(\$p, $value) 

我一直都明白,如果对象很大,通过引用可以导致显着的速度增加。在面向对象中,很可能你正在处理大型对象(例如巨大的XML::Twig)。那么当你真的把它作为子程序的参考传递时,你如何在这样的对象上调用一个方法?

+1

尼特:'$ P-> a_method($值)'不一定需要在当前包子作为报价暗示。 '$ p-> a_method($ value)'更接近'my $ sub = $ p-> can('a_method') - >($ p,$ value);' – ikegami

+2

'$ p'是一个引用(a你不能算术的指针),并且引用通过引用传递(因为所有参数都是通过Perl中的引用传递的)。这两个(独立地)使对象的大小与方法调用无关,前者使对象的大小与'my $ self = shift'无关。 – ikegami

回答

9

$p已包含对该对象的引用。方法调用需要对该对象的引用,并且它是传递给该子对象的引用。所以,$ self总是一个参考。见perlobjbless

#! /usr/bin/perl 
use strict; 
use warnings; 
use feature 'say'; 

{ package Class; 

    sub new { bless {}, __PACKAGE__ } 
    sub inf { ref shift } 
} 

my $o = 'Class'->new; 
say $o->inf ? 'reference' : 'not a reference'; 

输出:

reference 
+0

谢谢,我找不到任何关于此事的信息。 PerlMaven的例子也让我更加困惑,因为它是如何被重写的,似乎它是通过价值传递的。 –

+0

嗯,它是 - 但只是因为“参考”是一个值。有点像指针。 (虽然并非完全)。 – Sobrique

+0

@Bram Vanroy,Re“*它似乎是通过值传递的*”,所有参数都通过Perl中的引用传递,虽然我们通常会继续复制它们('my($ arg)= @_;') 。 – ikegami