Всем привет. Среда — день Perl-поста. Сегодня поговорим еще об одной интересной вещи в Perl 6, которая, думаю, многим понравится.
Но прежде позвольте мне познакомить вас с еще одним интересным ресурсом, посвященным перлу — onperl.ru. Пока частота постов там — раз в сутки, так что интересно.
Итак, начинаем разговор о Мультифункциях.
Ранее мы уже знакомились с тем, как выглядят подпрограммы в Perl 6. Мы знаем, что они (подпрограммы), в отличие от Perl 5, имеют описания. Но это еще не все. В Perl 6 вы можете создавать разные функции с одним именем, используя различные описания.
Для этого нужно явно сказать перлу, что эта подпрограмма является мульти-функцией:
multi sub hello ...
multi sub hello ...
Работает это так: рантайм-машина анализирует передаваемые в функцию параметры и вызывает именно ту, которая будет лучше всего соответствовать. На языке разработчиков, такая функция называется «кандидат».
При этом, никто не гарантирует, что функция-кандидат, выбранная Perl 6 будет именно той, что вы хотите. Просто perl 6 вызовет ту, что ближе всего, по его мнению, стоит в описании. Но отчаиваться не нужно — Perl 6 достаточно умен, чтобы понимать разницу в описании функций по нескольким критериям.
Выбор по количеству передаваемых параметров
multi sub greet($name) {
say "Ahoj, $name!";
}
multi sub greet($name, $greeting) {
say "$greeting, $name!";
}
greet('Anna'); # Ahoj Anna
greet('Лена', 'Привет '); # Привет, Лена"
В этом случае, рантайм-машина ищет «кандидата» по количеству переданных в него аргументов.
Выбор по типу передаваемых параметров
multi sub double(Num $x) {
return 2 * $x;
}
multi sub double(Str $x) {
return "$x $x";
}
say double(21); # 42
say double("hej"); # hej hej
Камень-ножницы-бумага теперь просто:
class Paper { }
class Scissor { }
class Stone { }
multi win(Paper $a, Stone $b) { 1 }
multi win(Scissor $a, Paper $b) { 1 }
multi win(Stone $a, Scissor $b) { 1 }
multi win(Any $a, Any $b) { 0 }
say win(Paper.new, Scissor.new); # 0
say win(Stone.new, Stone.new); # 0
say win(Paper.new, Stone.new); # 1






































19 августа 2009, 08:48
19 августа 2009, 08:56
19 августа 2009, 11:55
19 августа 2009, 16:05
19 августа 2009, 16:09