Perl 6名称空间和模块系统

问题描述 投票:5回答:2

我对Perl和Perl 6还是很陌生,而且我无法与Perl 6模块/命名空间/包系统相处。

我正在图书馆。假设我的公司名称为MyCompany。而库是“类别” Net。那么我的文件层次结构应该是什么样?应该是lib/MyCompany/Net/MyLibrary.pm吗?还是lib/Net/MyLibrary.pm?还是其他?

而且,我应该将我的类定义包装成这样吗?

package MyCompany {
  class Net::MyLibrary { 
perl naming-conventions perl6 raku
2个回答
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...

并且块中的所有内容都将属于您声明的类。


2
投票

答案是,这完全取决于您。关于模块名称是否应包含公司名称或其类别名称,没有任何规则。您可以将其命名为MyLibrary,它将正常工作

如果您正在编写大量的库,或者要适合现有的库结构,则需要建立该结构并遵循其规则

如果您担心名称与现有CPAN模块冲突,那么最好使用特殊的前缀。您的公司名称会起作用,因此所有包装都将以MyCompany::开头。之后选择放置的内容是您的选择,但是以某种方式对模块进行分类很有意义

另一方面,如果要编写的文件要适合那里的方案,则应以Net::HTML::Math::等开头

因此,假设您要编写一个网络模块以用于可能还使用CPAN中某些模块的程序中。以MyCompany::开头的名称将保护您免受与其他软件包的冲突。然后,您可能希望Net::保留自己的类别或网络模块。然后,您将需要MyCompany::Net::中的唯一名称,例如MyModule,但我希望它会更具表达力。

然后您的包将是MyCompany::Net::MyModule,源代码将在文件MyCompany/Net/MyModule.pm中。请注意,所有句段均应以大写字母开头

© www.soinside.com 2019 - 2024. All rights reserved.