gpt4 book ai didi

perl - 谁能用 Perl 解释一下(我的 $self = shift)

转载 作者:行者123 更新时间:2023-12-03 09:15:48 28 4
gpt4 key购买 nike

我很难理解 OO Perl 和 my $self = shift; 的交集。关于这些单独元素的文档很棒,但我发现它们都没有涉及它们如何协同工作。

我一直在使用 Moose 制作带有属性的模块,当然,在所述模块中引用模块的属性很有用。我一再被告知要使用 my $self = shift;在子例程中将模块的属性分配给该变量。这是有道理且有效的,但是当我也将参数传递给子例程时,这个过程显然采用了 @ARGV 的第一个元素数组并将其分配给 $self以及。

有人能解释一下我如何使用 shift 来获得对模块属性的内部访问,同时还在 @ARGV 中传递参数吗?大批?

最佳答案

首先,子程序没有通过 @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 中,您需要为您编写的每个方法显式地执行此操作。

关于perl - 谁能用 Perl 解释一下(我的 $self = shift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com