[Moscow.pm] Пост на Хабре ?Функции в Perl?

Victor Efimov victor на vsespb.ru
Ср Авг 13 13:12:54 PDT 2014


13 августа 2014 г., 23:58 пользователь Antonio Nikishaev <a на lelf.me> написал:
>
> On 13 Aug 2014, at 23:10, Flore <flore на ya.ru> wrote:
>
>> Эмм, возможно, я пропустила, но я бы добавила небольшое объяснение про прототипы функции, что это спорная штука, и многие считают, что оно скорее зло, чем добро.
>
> Не то чтобы зло, просто очень специальная штука.
>
> А то что не про Method::Signatures, не про ням ням signatures в 5.20 ни слова — авторам полный и сплошной низачот.
>
>
>> И вот простой пример: допустим, есть функция, которая хочет два скаляра в качестве аргументов, один обязательный, один нет (это будет записано как sub func($;$)). Я завожу массив @arr = qw/a b/ и вызываю функцию от массива: func(@arr). Логично будет подумать, что "а" положится в первый аргумент, а "b" во второй.
>
> В 5.20 с сигнатурами всё по-человечески как ожидается.
> (На самом деле если прототипы уметь готовить, то их поведение тоже вполне логично. Но в любом случае их трогать за исключением 0.001% случаев не надо.)
>
>
>> Однако, это не так. Перл хочет скаляр, поэтому то, что он получает, он и интерпретирует как скаляр, а получает он массив - и значит, он просто берёт длину массива, то есть, 2, а второй аргумент функции у него будет неопределён. И никакой ошибки не напишет, поэтому отследить это будет трудно.
>> Большая статья на тему: http://www.perlmonks.org/?node_id=861966
>> Статья покороче: http://www.perlmonks.org/?node_id=406231
>>

небольшое предупреждение есть:
===
Зачастую разное понимание цели этого механизма приводит к холиварам с
адептами других языков, утверждающих, что «у перла плохие прототипы».
Так вот, прототипы в Perl не для жёсткого ограничения типов
параметров, передаваемых функциям. Это подсказка для языка: как
разбирать то, что передаётся в функцию.
===

как бы оно работало с @a ? пыталось понять сколько в нём элементов и
если их больше двух - выдавало ошибку? но это уже не была бы стадия
компиляции, а стадия исполнения.
если нужно передать массив то прототип - func(@), но это как раз не
даст никаких ограничений по количеству аргументов.

вот и сказано что это про то как разбирать то что пердаётся в функцию
(парсить исходник т.е.) и не создано для ограничения количества и типа
параметров.

можно впринципе было бы подробнее написать, и вообще при каждом
упоминании прототипов полезно напоминать что их неверное толкование
приводит на целое поле граблей.


Подробная информация о списке рассылки Moscow-pm