我对Perl和Perl 6很陌生。而且我无法与Perl 6模块/命名空间/包系统相处。
我正在图书馆工作。假设我公司的名称是MyCompany
。图书馆是"类别" Net
。那我的文件层次结构应该是什么样的呢?它应该是lib/MyCompany/Net/MyLibrary.pm
吗?还是lib/Net/MyLibrary.pm
?或其他什么?
另外,我应该将我的类定义包装成这样的东西吗?
package MyCompany {
class Net::MyLibrary {
答案 0 :(得分:3)
对于第一部分,::
仍然是目录分隔符,因此应该通过查看CPAN或Github来清楚如何设置包。这给了关于它们做什么以及它们如何相关的类,尽管它是主观的。对于第二个问题,您在这里混合使用Perl 5和Perl6语法。在Perl6中声明类有两种方法。第一个是Perl 5中熟悉的方法(除了更具描述性的class
语句);
unit class MyCompany;
unit
告诉Perl 6该类将扩展到文件的末尾(就像package MyCompany;
扩展到Perl 5模块中文件的末尾,或直到另一个package ..
声明)。您也可以像上面一样用块声明类和角色。
class MyCompany { # so begins the MyCompany class
method foo {
return self;
}
## ...other methods
} # the end of MyCompany
# code from other classes...
块中的所有内容都属于您声明的类。
答案 1 :(得分:2)
答案是,这取决于你。没有关于模块名称是否应包含公司名称或类别名称的规则。您可以将其称为MyLibrary
,它可以正常工作
如果您正在编写大型库,或者您希望适应现有的库结构,那么您需要建立该结构并遵循其规则
如果您担心与现有CPAN模块发生冲突的名称,那么使用特殊前缀是个好主意。您的公司名称可以,因此您的所有包都将以MyCompany::
开头。之后您所选择的是您的选择,但以某种方式对模块进行分类是有意义的
另一方面,如果您正在撰写要上传到符合其中方案的CPAN内容,那么您应该使用Net::
,HTML::
,{{ 1}}等等。
因此,假设您要编写一个网络模块,以便在可能也使用CPAN中的某些模块的程序中使用。使用Math::
启动名称可以保护您免受与其他软件包的冲突。然后,您可能希望MyCompany::
保留您自己的类别或网络模块。然后,您需要Net::
中的唯一名称,例如MyCompany::Net::
,但我希望它会更具表现力
然后你的包将是MyModule
,源代码将在文件MyCompany::Net::MyModule
中。请注意,所有细分都应以大写字母