Курс по 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
.
Заключение
В крайна сметка: за да избегнете такива проблеми, не добавяйте интервал между името на функцията и скобите с аргументите на функцията и се опитайте да избягвате скобите, ако това е възможно с други конструкции на езика като контролен поток.
Навигация по курса
← Повече за функциите | Повече за функциите / Типизирани параметри →
💪 Or jump directly to the exercise to this section.
Тази страница е автоматично преведена с ChatGPT 4.0. Оригинален текст на английски
Преводи на тази страница: English • Deutsch • Español • Italiano • Latviešu • Nederlands • Български • Русский • Українська