Perl允许一个包将符号导出到另一个包的名称空间,这对我来说似乎很奇怪。导出包不知道使用的包是否已经定义了同名的符号,它当然也不能保证它是唯一一个使用该名称导出符号的包。
由此导致的very common problem正在同时使用CGI和LWP::Simple。两个包都会导出head()并导致错误。我知道,这很容易解决,但这不是重点。您不应该为了使用两个实际核心的Perl库而采取变通办法。
据我所知,这么做的唯一原因是懒惰。不键入Foo::或使用对象接口可以节省一些击键次数,但这样做真的值得吗?
发布于 2009-10-14 04:48:09
默认情况下,从一个模块中导出所有函数的做法不是Perl推荐的做法。只有在有充分理由的情况下,才应该导出函数。推荐的做法是使用EXPORT_OK,这样用户就必须键入所需函数的名称,例如:
use My::Module 'my_function';以前的模块,比如LWP::Simple和CGI,都是在这个建议出现之前编写的,现在很难改变它们不导出东西,因为这会破坏现有的软件。我猜这个建议是通过人们注意到这样的问题而产生的。
无论如何,Perl的面向对象的对象或其名称并不要求您导出任何内容,而且您也不必回答$foo->,所以您的问题的这一部分是错误的。
发布于 2009-10-14 05:58:47
导出是一项功能。就像任何语言中的其他功能一样,如果你(Ab)太频繁地使用它,或者不应该使用它的地方,它可能会带来问题。明智地使用它是好的,否则就像其他任何功能一样。
回到当时还没有很多模块的时候,默认导出并不是一件坏事。然而,CPAN上有15,000个包,肯定会有冲突,这是不幸的。但是,现在修复模块可能会破坏现有代码。每当你做出一个糟糕的界面选择并将其发布给公众时,即使你不喜欢它,你也会致力于它。
所以,这很糟糕,但这就是它的方式,而且有办法绕过它。
发布于 2009-10-14 04:50:39
导出包不知道使用的包是否已经定义了同名的符号,它当然也不能保证它是唯一一个使用该名称导出符号的包。
如果您愿意,我想您的import()例程可以进行检查,但是默认的Exporter.pm例程不会进行检查(而且可能不应该这样做,因为它将被大量使用,并且总是检查是否定义了一个名称会导致严重的速度减慢(如果发现冲突,Exporter应该做什么?)。
据我所知,这么做的唯一原因是懒惰。不键入Foo::或使用对象接口可以节省一些击键次数,但这样做真的值得吗?
Foo::并不是那么糟糕,但考虑一下My::Company::Private::Special::Namespace:: -如果我们只导出一些东西,你的代码会看起来干净得多。不是所有的东西都可以(或者应该)在顶级名称空间中。
当导出机制使代码更整洁时,应该使用导出机制。当名称空间冲突时,不应该使用它,因为它显然不会使代码更干净,但除此之外,我喜欢在请求时导出内容。
https://stackoverflow.com/questions/1564277
复制相似问题