首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要在Perl中导出符号?

为什么要在Perl中导出符号?
EN

Stack Overflow用户
提问于 2009-10-14 04:43:30
回答 5查看 359关注 0票数 2

Perl允许一个包将符号导出到另一个包的名称空间,这对我来说似乎很奇怪。导出包不知道使用的包是否已经定义了同名的符号,它当然也不能保证它是唯一一个使用该名称导出符号的包。

由此导致的very common problem正在同时使用CGILWP::Simple。两个包都会导出head()并导致错误。我知道,这很容易解决,但这不是重点。您不应该为了使用两个实际核心的Perl库而采取变通办法。

据我所知,这么做的唯一原因是懒惰。不键入Foo::或使用对象接口可以节省一些击键次数,但这样做真的值得吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-14 04:48:09

默认情况下,从一个模块中导出所有函数的做法不是Perl推荐的做法。只有在有充分理由的情况下,才应该导出函数。推荐的做法是使用EXPORT_OK,这样用户就必须键入所需函数的名称,例如:

代码语言:javascript
复制
use My::Module 'my_function';

以前的模块,比如LWP::Simple和CGI,都是在这个建议出现之前编写的,现在很难改变它们不导出东西,因为这会破坏现有的软件。我猜这个建议是通过人们注意到这样的问题而产生的。

无论如何,Perl的面向对象的对象或其名称并不要求您导出任何内容,而且您也不必回答$foo->,所以您的问题的这一部分是错误的。

票数 9
EN

Stack Overflow用户

发布于 2009-10-14 05:58:47

导出是一项功能。就像任何语言中的其他功能一样,如果你(Ab)太频繁地使用它,或者不应该使用它的地方,它可能会带来问题。明智地使用它是好的,否则就像其他任何功能一样。

回到当时还没有很多模块的时候,默认导出并不是一件坏事。然而,CPAN上有15,000个包,肯定会有冲突,这是不幸的。但是,现在修复模块可能会破坏现有代码。每当你做出一个糟糕的界面选择并将其发布给公众时,即使你不喜欢它,你也会致力于它。

所以,这很糟糕,但这就是它的方式,而且有办法绕过它。

票数 9
EN

Stack Overflow用户

发布于 2009-10-14 04:50:39

导出包不知道使用的包是否已经定义了同名的符号,它当然也不能保证它是唯一一个使用该名称导出符号的包。

如果您愿意,我想您的import()例程可以进行检查,但是默认的Exporter.pm例程不会进行检查(而且可能不应该这样做,因为它将被大量使用,并且总是检查是否定义了一个名称会导致严重的速度减慢(如果发现冲突,Exporter应该做什么?)。

据我所知,这么做的唯一原因是懒惰。不键入Foo::或使用对象接口可以节省一些击键次数,但这样做真的值得吗?

Foo::并不是那么糟糕,但考虑一下My::Company::Private::Special::Namespace:: -如果我们只导出一些东西,你的代码会看起来干净得多。不是所有的东西都可以(或者应该)在顶级名称空间中。

当导出机制使代码更整洁时,应该使用导出机制。当名称空间冲突时,不应该使用它,因为它显然不会使代码更干净,但除此之外,我喜欢在请求时导出内容。

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

https://stackoverflow.com/questions/1564277

复制
相关文章

相似问题

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