| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > прототипы и с чем их едят? |
| Автор: Paul56 11.11.2008, 20:09 |
| Уважаемые коллеги, объясните мне как пользоваться прототипами и для чего они нужны. ну например не могу понять sub myrand ($) ^ это прототип и как им пользоваться? |
| Автор: xoma 11.11.2008, 21:50 |
| При вызове данной функции Perl проверит что ей передан один параметр - scalar, если это не так выдаст сообщение об ошибке (это очень примитивное объяснение ....на самом деле все немного сложнее).... |
| Автор: arto 11.11.2008, 22:12 |
| perldoc perlsub |
| Автор: sir_nuf_nuf 11.11.2008, 22:19 | ||||||||
| прототипв влияют на то, что перл считает аргументами функции и на то как он их передает. простые примеры. Если передавать параметры без скобок:
в случае если 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 12.11.2008, 06:44 |
| С прототипами лучше не замарачиваться. Но есть один трюк который очень даже может быть полезен. Это объявление констант. sub PI () {3.144} и теперь PI у нас встраиваемая функция. Ее возращаемое значение будет вставлена во всех местах программы где стоит PI во время компиляции. $n = PI *$r*$r; |
| Автор: demond 12.11.2008, 17:04 |
| tolkien, а причем тут прототипы? ActiveState в своей документации это называет 'Constant Functions'. |
| Автор: tolkien 12.11.2008, 17:17 |
| Когда пишешь sub имя_функции ставишь круглые скобки. Очень похоже на объявление прототипа. |
| Автор: demond 12.11.2008, 17:25 |
| А скобки, вроде, можно и опустить. |
| Автор: tolkien 12.11.2008, 17:36 | ||||
| Скобки делают их особенными(отличными от обычных). Функция объявленная sub name () - являеться встроенной.
результат
Ну как видно результаты PI1 и PI3 практически абсолютно одинаковы. Потому что PI1 являться встраиваемой функцией. А PI2 просто функцией. Код с PI2 работает медленнее из за вызовов функции PI2. |
| Автор: tolkien 12.11.2008, 19:20 |
| ginnie спс за интересные комментарии. Я сам докум ActiveState мало читал. В основном книги. И в одной из них прочел что если делать как выше получается встраиваемая функция. Ну как по аналогии с inline функциями из СИ. |
| Автор: ginnie 12.11.2008, 19:34 |
| tolkien, про константные функции написано в http://perldoc.perl.org/perlsub.html#Constant-Functions и Camel Book (почти одно и тоже |
| Автор: Paul56 13.11.2008, 10:31 |
| Коллеги, благодарю за ответы. |