Курс по 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. Оригинален текст на английски

Преводи на тази страница: EnglishDeutschEspañolItalianoLatviešuNederlandsБългарскиРусскийУкраїнська