![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Paul56 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 19.9.2008 Где: Екатеринбург Репутация: нет Всего: нет |
Уважаемые коллеги, объясните мне как пользоваться прототипами и для чего они нужны.
ну например не могу понять sub myrand ($) ^ это прототип и как им пользоваться? |
|||
|
||||
| xoma |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2007 Репутация: нет Всего: нет |
При вызове данной функции Perl проверит что ей передан один параметр - scalar, если это не так выдаст сообщение об ошибке (это очень примитивное объяснение ....на самом деле все немного сложнее)....
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc perlsub
|
|||
|
||||
| sir_nuf_nuf |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
прототипв влияют на то, что перл считает аргументами функции и на то как он их передает.
простые примеры. Если передавать параметры без скобок:
в случае если my_func объявлена без прототипов:
здесь @args == (1,2,1,2,3,2,1); все как обычно в случае если my_func объявлена:
здесь @args == (1); функция откусывает от списка только один элемент (!) в случае если my_func объявлена:
здесь @args == (1,2, [1,2,3,2,1]); функция неявно преобразует массив в ссылку на массив, а если была бы без прототипов - то раскрыла бы массив в список и было бы @args == (1,2,1,2,3,2,1) Если передавать параметры в скобках поведение немного меняется: добавляется проверка количетва аргументов.. |
||||||||
|
|||||||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
С прототипами лучше не замарачиваться.
Но есть один трюк который очень даже может быть полезен. Это объявление констант. sub PI () {3.144} и теперь PI у нас встраиваемая функция. Ее возращаемое значение будет вставлена во всех местах программы где стоит PI во время компиляции. $n = PI *$r*$r; Это сообщение отредактировал(а) tolkien - 12.11.2008, 07:02 |
|||
|
||||
| demond |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 20.2.2008 Репутация: нет Всего: нет |
tolkien, а причем тут прототипы? ActiveState в своей документации это называет 'Constant Functions'.
|
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Когда пишешь sub имя_функции ставишь круглые скобки. Очень похоже на объявление прототипа.
|
|||
|
||||
| demond |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 20.2.2008 Репутация: нет Всего: нет |
А скобки, вроде, можно и опустить.
|
|||
|
||||
| tolkien |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Скобки делают их особенными(отличными от обычных).
Функция объявленная sub name () - являеться встроенной.
результат
Ну как видно результаты PI1 и PI3 практически абсолютно одинаковы. Потому что PI1 являться встраиваемой функцией. А PI2 просто функцией. Код с PI2 работает медленнее из за вызовов функции PI2. Это сообщение отредактировал(а) tolkien - 12.11.2008, 18:26 |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Дело в том, что интерпретатор может заменить вызов функции на константное значение результата ее выполнения (Constant Functions) только для функций, которые не принимают параметров. Указать, что функция не принимает параметров можно только с помощью прототипа - пустых скобок. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
ginnie
спс за интересные комментарии. Я сам докум ActiveState мало читал. В основном книги. И в одной из них прочел что если делать как выше получается встраиваемая функция. Ну как по аналогии с inline функциями из СИ. |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Paul56 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 19.9.2008 Где: Екатеринбург Репутация: нет Всего: нет |
Коллеги, благодарю за ответы.
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |