Курс по Raku / Основи / Основи на функциите / Повече за функциите
Внимание към пространството
Използването на функции в Raku е предимно интуитивно и не създава проблеми, но трябва да бъдете предупредени за следния аспект.
TL;DR
Не добавяйте интервал между името на функцията и скобите с нейните
аргументи. Но използвайте интервал след for и
if.
Дълга история
Нека вземем една проста функция:
sub f($x, $y) {
return $x + $y;
}Първо, обърнете внимание на отсъствието на интервали между името на функцията и отварящите скоби, които съдържат параметрите. Някои стилове на кодиране в други езици може да изискват интервал там. Raku е добре с това, но това не е практика, която да следвате:
sub f ($x, $y) {
return $x + $y;
}От страната на извикването, отсъствието на интервал е важно. Ако извикате функцията и пропуснете скобите, тогава интервалът след името на функцията е неизбежен:
f 5, 6;Но ако добавите скоби, не можете да имате интервал преди тях. Това е правилното извикване:
f(5, 6);А това извикване е грешно:
f (5, 6);Такъв код предизвиква изключение:
Too few positionals passed; expected 2 arguments but got 1
sub f at t.raku line 1
in block <unit> at t.raku line 5
Raku вижда извикването с интервал f (5, 6) като опит да
се предаде един аргумент (5, 6) на функцията. Можете лесно
да проверите типа на този аргумент, ако пренапишете функцията да приема
само един аргумент:
sub f($param) {
say $param.WHAT;
}
f (5, 6); # (List)Така че, извикването f (5, 6) означава, че предаваме списък на функцията. Списък
като единична същност.
Кога е нужен интервал
В някои случаи, интервалът е необходим. Това се случва, когато
използвате скоби с една от ключовите думи, като if или
for или loop. Следният код е грешен:
if(True != False) {
say 'OK';
}Съобщението за грешка обяснява какво не е наред:
===SORRY!===
The word 'if' is interpreted as a 'if()' function call. Please use
whitespace instead of parentheses.
at /Users/ash/raku-course/t.raku:1
------> if⏏(True != False) {
Unexpected block in infix position (two terms in a row)
at /Users/ash/raku-course/t.raku:1
------> if(True != False)⏏ {
В случая с if, скобите изобщо не са необходими, така че
проблемът няма шанс да се появи, ако не ги използвате. Но в някои
случаи, като например с loop, трябва да ги имате, и
интервалът става задължителен:
loop(my $c = 0; $c != 10; $c++) { say $c }В този код се случва същото: loop(...) се разбира от
компилатора като извикване на функция. Добавете интервал, за да
разрешите проблема. Или по-добре пренапишете фрагмента, използвайки
for.
Заключение
В крайна сметка: за да избегнете такива проблеми, не добавяйте интервал между името на функцията и скобите с аргументите на функцията и се опитайте да избягвате скобите, ако това е възможно с други конструкции на езика като контролен поток.
Навигация в курса
← Повече за функциите | Типизирани параметри →
💪 Или преминете направо към
упражнението към този раздел.