new( name => "Numb-6ren">
gpt4 book ai didi

perl - 为什么有些用户在 Perl 中引用类名?

转载 作者:行者123 更新时间:2023-12-04 02:16:23 25 4
gpt4 key购买 nike

看着 Type::Tiny ,我看到调用中的类名Type::Tiny->new在官方文档中引用,

my $NUM = "Type::Tiny"->new(
name => "Number",
constraint => sub { looks_like_number($_) },
message => sub { "$_ ain't a number" },
);

为什么是这样?这仅仅是风格吗?这种做法是否有任何性能影响?

最佳答案

举个更简单的例子

package Foo { sub new { die 7  } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
在上面的例子中,常数 Foo解析为“Bar”,因此调用 "Bar"->new不是 "Foo"->new .你如何阻止子程序解析?你可以引用它。
"Foo"->new();
至于性能影响,使用字符串而不是裸字不会使事情变得更糟。我已经确认了 O=Deparse 生成的 optree是一样的。因此,作为一般规则,如果您重视正确性,似乎最好引用类名。
这在Programming Perl中提到,(遗憾的是在间接方法调用的上下文中)

... so we'll tell you that you can almost always get away with a bare class name, provided two things are true. First, there is no subroutine of the same name as the class. (If you follow the convention that subroutine names like new start lowercase and class names like ElvenRing start uppercase, this is never a problem). Second, the class been loaded with one of

use ElvenRing;
require ElvenRing;

Either of these declarations ensures that Perl knows ElvenRing is a module name, which forces any bare name like new before the class name ElvenRing to be interpreted as a method call, even if you happen to have declare a new subroutine of your own in the current package.


而且,这是有道理的:只有当您的子例程(通常是小写)与类(通常是大写)同名时,才会发生这里的混淆。只有当您违反上述命名约定时才会发生这种情况。
tldr;引用你的类名可能是个好主意,如果你知道它们并且你重视正确性而不是困惑。
旁注:或者,您可以通过附加 :: 来停止对函数的裸字解析。到它的结尾,例如在上面 Foo::->new .

感谢 Ginnz on reddit for pointing this out to me ,然后到 Toby Inkster for the comment (though it didn't make sense to me on first read).

关于perl - 为什么有些用户在 Perl 中引用类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59042700/

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