Еще три опции:
sub
Вы можете написать анонимные подпрограммы , используя sub
без имени:
my $fib = sub (Int $x --> Int) {
return 0 if $x == 0;
return 1 if $x == 1;
return $fib($x - 1) + $fib($x - 2);
}
say $fib(13); # 233
См. Ответ @ HåkonHægland о том, почему это (намеренно) не работает с нестандартными блоками.
leave
Дизайн ожидал вашего вопроса:
my $fib = -> Int $x --> Int {
leave 0 if $x == 0;
leave 1 if $x == 1;
leave $fib($x - 1) + $fib($x - 2);
}
компилирует.Надеюсь, вы можете догадаться, что то, что он делает - или, скорее, должен делать - это именно то, что вы хотели сделать.
К сожалению, если вы выполните приведенное выше с помощью:
say $fib(13);
Вы получаете ошибку во время выполнения "оставьте еще не реализованным".
Я предполагаю, что это будет реализовано через несколько лет, и в сообщении об ошибке «Попытка возврата за пределы обычной» будет упоминаться leave
.Но его реализация имеет очень низкий приоритет, потому что легко написать sub
, как описано выше, или написать код, как это сделал @ HåkonHægland, или использовать конструкцию оператора case / switch следующим образом, и на данный момент этого вполне достаточно.
case / switch (when
/ default
)
Вы можете указать параметр как $_
вместо $x
, и тогда вы можете использовать конструкции, которые относятся к теме:
my $fib = -> Int $_ --> Int {
when 0 { 0 }
when 1 { 1 }
$fib($_ - 1) + $fib($_ - 2)
}
say $fib(13); # 233
См. when
.