13 августа 2014 г., 23:58 пользователь Antonio Nikishaev <[email protected]> написал: > > On 13 Aug 2014, at 23:10, Flore <[email protected]> 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 mailing list [email protected] | http://moscow.pm.org
