|
|
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
Пишу модуль, код примерно такой: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Используется модуль примерно так: my $lib = new Library::Package; $lib->method(); Вроде бы все работает (при создании объекта выполняется код в new, при закрытии объекта/программы выполняется код в DESTROY). Но смущает то, что деструктор к модуле прописан явно (sub DESTROY), а конструктора в коде нет. Или new — это и есть зарезервированное имя для конструктора? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2012, 15:11 |
|
||
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
new - это соглашение. Вообще "конструктор" (такого понятия вообще-то нету, так как в Перле нету Объектов. Внезапно, правда?) - это bless $var, $class, однако это неудобно. Так как вместе с собственно "конструированием" объекта нужно и начальные действия делать... Вот для этого согласились что это может быть new. Если вы назовете его create - то никакой синтаксической ошибки не будет. Более того, это нормальное поведение, допустим у нас есть такая вещь: <Project>::Dict::<Table>->create_from_dbcolumn($db_col), который является конструктором. А вообще, в перле можно пользовать и прототипное наследование, если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2012, 21:20 |
|
||
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
Меня смутило не то, что используется new (а не create, к примеру), а то что они в разных регистрах. DESTROY всегда в верхнем, а new регистрозависимый и в вызывающем коде нужно указывать именно такой регистр. То есть если написать sub NEW, то и вызывать надо как $lib = NEW Library::Package (или $lib = Library::Package->NEW). То есть соглашение относится не к самому имени процедуры-конструктора, а к тому, что это имя можно указывать перед именем класса; об этом я не знал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2012, 09:18 |
|
||
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
Ха... Откройте для себя BEGIN и почитайте про пакеты и ООП в Перле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 00:43 |
|
||
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
Про BEGIN и END я знаю. Нелогичным мне показалось иное — то что DESTROY является частью синтаксиса, а new — соглашением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 09:05 |
|
||
|
[PERL] Конструктор в модуле
|
|||
|---|---|---|---|
|
#18+
Alibek B., Это связано с автоматической сборкой мусора. Т.к. в Perl объект нельзя удалить из памяти явно, должен быть некий механизм позволяющий высвободить ресурсы связанные с объектом (например закрыть файл, освободить сокет и т.д.). Таким механизмом и является вызов функции с предопределенным именем DESTROY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 14:13 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38016429&tid=1464500]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
168ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 424ms |

| 0 / 0 |
