powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Конструктор в модуле
7 сообщений из 7, страница 1 из 1
[PERL] Конструктор в модуле
    #38013216
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу модуль, код примерно такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package ...
...

sub _init
{
  ...
}

sub new
{
  my $this = shift;
  my $class = ref($this) || $this;
  &_init();
  my $self = {};
  bless $self, $class;
  return $self;
}

sub DESTROY
{
  ...
}
...



Используется модуль примерно так:

my $lib = new Library::Package;
$lib->method();

Вроде бы все работает (при создании объекта выполняется код в new, при закрытии объекта/программы выполняется код в DESTROY). Но смущает то, что деструктор к модуле прописан явно (sub DESTROY), а конструктора в коде нет. Или new — это и есть зарезервированное имя для конструктора?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38013787
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new - это соглашение. Вообще "конструктор" (такого понятия вообще-то нету, так как в Перле нету Объектов. Внезапно, правда?) - это bless $var, $class, однако это неудобно. Так как вместе с собственно "конструированием" объекта нужно и начальные действия делать... Вот для этого согласились что это может быть new. Если вы назовете его create - то никакой синтаксической ошибки не будет. Более того, это нормальное поведение, допустим у нас есть такая вещь: <Project>::Dict::<Table>->create_from_dbcolumn($db_col), который является конструктором.

А вообще, в перле можно пользовать и прототипное наследование, если что.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38014053
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня смутило не то, что используется new (а не create, к примеру), а то что они в разных регистрах. DESTROY всегда в верхнем, а new регистрозависимый и в вызывающем коде нужно указывать именно такой регистр.
То есть если написать sub NEW, то и вызывать надо как $lib = NEW Library::Package (или $lib = Library::Package->NEW). То есть соглашение относится не к самому имени процедуры-конструктора, а к тому, что это имя можно указывать перед именем класса; об этом я не знал.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38016429
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха... Откройте для себя BEGIN и почитайте про пакеты и ООП в Перле.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38016512
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про BEGIN и END я знаю.
Нелогичным мне показалось иное — то что DESTROY является частью синтаксиса, а new — соглашением.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38016999
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Это связано с автоматической сборкой мусора. Т.к. в Perl объект нельзя удалить из памяти явно, должен быть некий механизм позволяющий высвободить ресурсы связанные с объектом (например закрыть файл, освободить сокет и т.д.).
Таким механизмом и является вызов функции с предопределенным именем DESTROY.
...
Рейтинг: 0 / 0
[PERL] Конструктор в модуле
    #38017821
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Та это... Конструктором много. Деструктор - один. Это везде так.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Конструктор в модуле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]