Perl 6 пространство имен и модульная система

Я новичок в Perl и Perl 6. И я не могу согласиться с Perl 6 module/namespace/package system.

Я работаю над библиотекой. Скажем, имя моей компании MyCompany. И библиотека является "категорией" Net. Итак, как должна выглядеть иерархия файлов? Должно ли это быть lib/MyCompany/Net/MyLibrary.pm? Или lib/Net/MyLibrary.pm? Или что-то еще?

Кроме того, следует ли переопределить определение моего класса таким образом?

package MyCompany {
 class Net::MyLibrary {
2 ответа

Для первой части :: по-прежнему является разделителем каталогов, поэтому должно быть ясно, как настроены пакеты, просматривая 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::. То, что вы ставите после этого, - ваш выбор, но имеет смысл классифицировать ваши модули каким-то образом.

С другой стороны, если вы пишете что-то, что вы хотите загрузить в CPAN, который вписывается в схемы там, тогда вы должны начать свое имя пакета с Net::, HTML::, Math:: и т.д.

Итак, предположим, вы хотите написать сетевой модуль для использования в программах, которые также могут использовать некоторые модули из CPAN. Запуск имени с помощью MyCompany:: защитит вас от столкновений с другими пакетами. Затем вы можете захотеть Net:: сохранить свою собственную категорию или сетевые модули. И тогда вам понадобится уникальное имя в MyCompany::Net::, например MyModule, но я надеюсь, что это будет более выразительно

Тогда ваш пакет будет MyCompany::Net::MyModule, а исходный код будет в файле MyCompany/Net/MyModule.pm. Обратите внимание, что все сегменты должны начинаться с заглавной буквы

licensed under cc by-sa 3.0 with attribution.