Курс языка программирования 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 4o. Оригинальный текст на английском языке.

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