首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当子Foo::bar {}和子bar {}都属于包Foo时,它们之间有什么区别?

当子Foo::bar {}和子bar {}都属于包Foo时,它们之间有什么区别?
EN

Stack Overflow用户
提问于 2014-07-22 09:02:13
回答 2查看 209关注 0票数 8

假设我们有这样的代码

代码语言:javascript
运行
复制
package Foo;
sub bar {
    say 'hi';
}

还有这个

代码语言:javascript
运行
复制
package Foo;
sub Foo::bar {
    say 'hi';
}

我以为它们是等价物,所以我们可以这样做

代码语言:javascript
运行
复制
Foo->bar();

是否使用完全限定名定义方法。然而,在某些情况下,两者确实不同。例如,在perldoc -f require提供的示例中,方法INC必须完全限定包名:

代码语言:javascript
运行
复制
# In Foo.pm
package Foo;
sub new { ... }
sub Foo::INC {
    my ($self, $filename) = @_;
    ...
}
# In the main program
push @INC, Foo->new(...);

如果我们没有完全限定方法名,那么就会发生编译时错误。那么,完全限定名和不加包名之间有什么区别呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 13:41:37

使@main::INC成为全局可访问的@INC的机制也会导致sub INC { }表示sub main::INC { }

引用珀尔瓦

以数字、控制字符或标点符号开头的Perl标识符不受package声明的影响,并且总是被迫在包main中;它们也不受strict 'vars'错误的影响。其他几个名字也可以通过以下方式获得豁免: STDIN公司STDOUT ARGV STDERR ARGVOUT SIG

如果我们没有完全限定方法名,那么就会发生编译时错误。

哼..。它不会做您想做的事情,但也不会导致编译时错误。

代码语言:javascript
运行
复制
$ perl -ce'
    package Foo;
    sub new { ... }
    sub INC {
        my ($self, $filename) = @_;
        ...
    }

    push @INC, Foo->new("...");
'
-e syntax OK
票数 6
EN

Stack Overflow用户

发布于 2014-07-22 13:10:06

perldoc -f require说明了为什么会这样:

如果钩子是一个对象,它必须提供一个INC方法,该方法将按上面的方式调用,第一个参数是对象本身。(请注意,您必须完全限定潜艇的名称,因为不合格的"INC“总是被强制放入包”main“中。)

因此,如果不使用包限定符,就会像编写sub main::INC {}一样。我不能告诉你为什么会这样,但我猜这是翻译中的特例之一。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24883095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档