Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 @arr = (1,2,3,2,1);
my $a = my_func 1, 2, @arr;  # заметим, что параметры передают не в скобках, а списком..


в случае если my_func объявлена без прототипов:
Код

sub my_func {
    my @args = @_; 
}

здесь @args == (1,2,1,2,3,2,1); все как обычно

в случае если my_func объявлена:
Код

sub my_func ($) {
    my @args = @_; 
}

здесь @args == (1);  функция откусывает от списка только один элемент (!)

в случае если my_func объявлена:
Код

sub my_func ($$\@) {
    my @args = @_; 
}

здесь @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 () - являеться встроенной.

Код

use Benchmark qw(:all) ;

print time,"\n";

sub PI1()  {3.144}
sub PI2  {3.144}

timethese(1000000, {
        'PI1' => sub {my $n = PI1 + 20;},
        'PI2' => sub {my $n = PI2 + 20;},
        'PI3' => sub {my $n = 3.144 + 20;}
    });


результат
Код

1226503612
Benchmark: timing 1000000 iterations of PI1, PI2, PI3...
       PI1:  0 wallclock secs ( 0.09 usr +  0.00 sys =  0.09 CPU) @ 10638297.87/s (n=1000000)
            (warning: too few iterations for a reliable count)
       PI2:  0 wallclock secs ( 0.45 usr +  0.00 sys =  0.45 CPU) @ 2202643.17/s (n=1000000)
       PI3:  0 wallclock secs ( 0.09 usr +  0.00 sys =  0.09 CPU) @ 10752688.17/s (n=1000000)
            (warning: too few iterations for a reliable count)


Ну как видно результаты PI1 и PI3 практически абсолютно одинаковы. Потому что  PI1 являться встраиваемой функцией. А PI2 просто функцией. Код с PI2 работает медленнее из за вызовов функции PI2. 

Автор: ginnie 12.11.2008, 19:07
Цитата(demond @  12.11.2008,  17:04 Найти цитируемый пост)
tolkien, а причем тут прототипы? ActiveState в своей документации это называет 'Constant Functions'.


Дело в том, что интерпретатор может заменить вызов функции на константное значение результата ее выполнения (Constant Functions) только для функций, которые не принимают параметров. Указать, что функция не принимает параметров можно только с помощью прототипа - пустых скобок.

Автор: 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 (почти одно и тоже  smile ).

Автор: Paul56 13.11.2008, 10:31
Коллеги, благодарю за ответы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)