Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прототипы и с чем их едят? 
:(
    Опции темы
Paul56
Дата 11.11.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 19.9.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Уважаемые коллеги, объясните мне как пользоваться прототипами и для чего они нужны.

ну например не могу понять 

sub myrand ($) 
                     ^ это прототип и как им пользоваться?
PM ICQ   Вверх
xoma
Дата 11.11.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



При вызове данной функции Perl проверит что ей передан один параметр - scalar, если это не так выдаст сообщение об ошибке (это очень примитивное объяснение ....на самом деле все немного сложнее)....
PM MAIL WWW   Вверх
arto
Дата 11.11.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc perlsub
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 11.11.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



прототипв влияют на то, что перл считает аргументами функции и на то как он их передает.

простые примеры.

Если передавать параметры без скобок:

Код

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)


Если передавать параметры в скобках поведение немного меняется:
добавляется проверка количетва аргументов..



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
tolkien
Дата 12.11.2008, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



С прототипами лучше не замарачиваться.
Но есть один трюк который очень даже может быть полезен. Это объявление констант.

sub PI () {3.144}

и теперь PI у нас встраиваемая функция. Ее возращаемое значение будет вставлена во всех местах программы где стоит PI во время компиляции. 

$n = PI *$r*$r;


Это сообщение отредактировал(а) tolkien - 12.11.2008, 07:02
PM MAIL   Вверх
demond
Дата 12.11.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.2.2008

Репутация: нет
Всего: нет



tolkien, а причем тут прототипы? ActiveState в своей документации это называет 'Constant Functions'.
PM MAIL   Вверх
tolkien
Дата 12.11.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Когда пишешь sub имя_функции ставишь круглые скобки.  Очень похоже на объявление прототипа.
PM MAIL   Вверх
demond
Дата 12.11.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.2.2008

Репутация: нет
Всего: нет



А скобки, вроде, можно и опустить.
PM MAIL   Вверх
tolkien
Дата 12.11.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Скобки делают их особенными(отличными от обычных). 
Функция объявленная 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. 

Это сообщение отредактировал(а) tolkien - 12.11.2008, 18:26
PM MAIL   Вверх
ginnie
Дата 12.11.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


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



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 12.11.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



ginnie
спс за интересные комментарии. Я сам докум ActiveState мало читал. В основном книги. И в одной из них прочел что если делать как выше получается встраиваемая функция. Ну как по аналогии с inline функциями из СИ. 
PM MAIL   Вверх
ginnie
Дата 12.11.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



tolkien, про константные функции написано в perlsub и Camel Book (почти одно и тоже  smile ).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Paul56
Дата 13.11.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 19.9.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Коллеги, благодарю за ответы.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.