我对Perl和Perl 6还是很陌生,而且我无法与Perl 6模块/命名空间/包系统相处。
我正在图书馆。假设我的公司名称为MyCompany
。而库是“类别” Net
。那么我的文件层次结构应该是什么样?应该是lib/MyCompany/Net/MyLibrary.pm
吗?还是lib/Net/MyLibrary.pm
?还是其他?
而且,我应该将我的类定义包装成这样吗?
package MyCompany {
class Net::MyLibrary {
对于第一部分,::
仍然是目录分隔符,因此应该清楚地了解如何通过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...
并且块中的所有内容都将属于您声明的类。
答案是,这完全取决于您。关于模块名称是否应包含公司名称或其类别名称,没有任何规则。您可以将其命名为MyLibrary
,它将正常工作
如果您正在编写大量的库,或者要适合现有的库结构,则需要建立该结构并遵循其规则
如果您担心名称与现有CPAN模块冲突,那么最好使用特殊的前缀。您的公司名称会起作用,因此所有包装都将以MyCompany::
开头。之后选择放置的内容是您的选择,但是以某种方式对模块进行分类很有意义
另一方面,如果要编写的文件要适合那里的方案,则应以Net::
,HTML::
,Math::
等开头
因此,假设您要编写一个网络模块以用于可能还使用CPAN中某些模块的程序中。以MyCompany::
开头的名称将保护您免受与其他软件包的冲突。然后,您可能希望Net::
保留自己的类别或网络模块。然后,您将需要MyCompany::Net::
中的唯一名称,例如MyModule
,但我希望它会更具表达力。
然后您的包将是MyCompany::Net::MyModule
,源代码将在文件MyCompany/Net/MyModule.pm
中。请注意,所有句段均应以大写字母开头