Каково различие между пакетом, модулем и классом в объектно-ориентированном Perl?

class.__stuff соглашение о присвоении имен сообщает программисту, он не предназначен для доступа __stuff снаружи. Искажение имени делает его вряд ли, любой сделает это случайно.

Правда, все еще можно работать вокруг этого, это еще легче, чем на других языках (какие BTW также позволяют Вам сделать это), но никакой Python программист не сделал бы это, если он заботится об инкапсуляции.

18
задан brian d foy 1 July 2017 в 18:58
поделиться

2 ответа

Модули - это один файл, файл .pm , содержащий код. Это может быть отсутствие пакетов, один пакет или более одного пакета. Модулю на самом деле все равно, что в нем, поэтому это может быть код, который вставляет себя в то же пространство имен, более традиционный набор подпрограмм в библиотеке или определение Perl-представления о классе.

Пакет, также известное как пространство имен, содержит собственные переменные и подпрограммы. Это способ разделения различных частей вашей программы. Вы создаете пакет и помещаете в него свой код:

package SomePackage;

sub some_subroutine { ... } # really SomePackage::some_subroutine

Вы загружаете модуль, чтобы получить доступ к пакету:

use SomePackage; # read and compile the module file

SomePackage::some_subroutine( ... );

Класс Perl - это пакет и связанное с ним поведение. Методы в классе - это просто обычные подпрограммы, хотя, когда мы рассматриваем подпрограммы как методы, первым параметром является вещь (имя пакета или объект, также известный как референт), который вызвал метод:

package SomeClass;

sub class_method { my( $class, @args ) = @_; ... }
sub instance_method { my( $self, @args ) = @_; ... }

Поскольку класс - это просто пакет, как и любой другой пакет, и, вероятно, живет в модуле, вы обращаетесь к нему таким же образом с помощью use :

 use SomeClass;

 my $i = SomeClass->class_method( ... ); 

ОО-стрелочный синтаксис выполняет некоторые особые функции, позволяющие подпрограмме some_method знать, что она вызывается как метод. Perl помещает референт (в данном случае SomeClass ) в качестве первого аргумента. Кроме того, при использовании объектно-ориентированного синтаксиса Perl знает, как использовать свои возможности наследования.

Методы, вызываемые с помощью '->', получают референт в качестве первого параметра метода, поэтому этот вызов:

  SomeClass->new('world'); 

синтаксически такой же, как если бы вы вызвали его с именем класса в качестве первого параметра:

  SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way

То же самое работает и с объектами. Когда объект является референтом:

my $i = SomeClass->new(); 
$i->bar( 'world'); 

объект является первым параметром в качестве метода:

SomeClass::bar($i, 'world'); 
29
ответ дан 30 November 2019 в 07:04
поделиться

Perl не имеет классов. В нем есть пространства имен, которые вы изменяете с помощью package . Для получения полной информации о Perl ООП см. Промежуточный Perl или Объектно-ориентированный Perl . Вы также можете ознакомиться с документацией perltoot и perlboot . Короче говоря, Perl подделывает то, что люди ожидают от «настоящих» классов, с помощью пакетов, обычных подпрограмм и ссылок.

Модуль - это распространяемый фрагмент кода, содержащийся в файле. См. perlmod .


Подробнее об этом я говорю в своем сообщении для The Effective Perler , Найдите диспетчеры выпуска модуля .

12
ответ дан 30 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: