gpt4 book ai didi

perl - Perl 程序什么时候需要我们?

转载 作者:行者123 更新时间:2023-12-04 21:55:20 27 4
gpt4 key购买 nike

看起来our只需要在包中公开一个(全局)变量。在其他情况下,它的使用仅有助于提高可读性,但不是必需的。

如果上述观察是正确的,那么按照封装的做法,在包中甚至不需要它,因为将使用 my ,并且将提供 getter 和 setter。

假设我的应用程序可以完全使用 OOD 实现,并且在包内,数据严格使用参数传递到子例程,那么我是否可以完全消除对我们的的需要?

最佳答案

当...时使用我们的

  1. 您需要使用全局变量。
  2. 您想要使用local(您可能不应该)。

总的来说,你是对的,你作为全局变量所做的任何事情都可以通过类方法访问器来完成,从而获得封装的所有优势

例如...

package Foo;
use strict;
use warnings;

our $Thing = 42;

相比...

package Foo;
use strict;
use warnings;

sub thing { 42 }

如果 $Foo::Thing 不再是一个简单的常量,会发生什么?如果它的计算成本很高并且很少使用怎么办?通过使用 Foo->thing 进行封装,您可以仅在需要时进行计算。

它还允许子类覆盖类信息。

package Bar;
our @ISA = qw(Foo);

sub thing { 23 }

这让我们知道何时使用我们的:当你必须时。有很多 Perl 功能和库可以通过约定或实现来读取全局变量。最常见的示例是用于子类化的 @ISA$VERSION 以及 Exporter 的沙拉。变量,例如 @EXPORT

有更好的方法可以做到这一点,并且许多模块(例如 Exporter)都有替代品,但是其中许多约定是在 Perl 5 不适应 OO 时制定的。


our 还有最后一个用途,那就是利用 local。它可用于传递额外的数据而不更改函数签名。函数退出时自动恢复原值。

our $foo;

sub something {
...do something involving $foo and set $stuff...

local $foo = $stuff;
something();
}

是的,这是一个糟糕的例子。

在这种情况下,这是有用和可取的,这再次表明了糟糕的设计。通常它用于在函数之间传递额外数据而不更改其签名,通常作为递归的一部分。 File::Find 中到处都是这种技术。运行 perldoc -m File::Find 并四处查看。

关于perl - Perl 程序什么时候需要我们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40696308/

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