首先,子程序没有传递给@ARGV
数组。相反,传递给子例程的所有参数都被展平为由子例程内部表示的单个列表@_
。@ARGV 数组在脚本的顶层可用,包含传递给脚本的命令行参数。
现在,在 Perl 中,当您调用对象的方法时,该对象会作为参数隐式传递给该方法。
如果忽略继承,
$obj->doCoolStuff($a, $b);
相当于
doCoolStuff($obj, $a, $b);
这意味着方法中的内容@_
将doCoolStuff
是:
@_ = ($obj, $a, $b);
现在,shift
没有任何参数的内置函数将元素移出默认数组变量@_
。在这种情况下,那将是$obj
.
所以当你这样做时$self = shift
,你实际上是在说$self = $obj
。
我也希望这能解释如何通过->
符号将其他参数传递给方法。继续我上面提到的例子,这将是:
sub doCoolStuff {
# Remember @_ = ($obj, $a, $b)
my $self = shift;
my ($a, $b) = @_;
此外,虽然Moose
它是 Perl 的一个很好的对象层,但它并没有消除您需要$self
在每个方法中初始化自己的要求。永远记住这一点。虽然像 C++ 和 Java 这样的语言会this
隐式初始化对象引用,但在 Perl 中,您需要为您编写的每个方法显式地进行初始化。