Курс языка программирования 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. Оригинальный текст на английском языке.
Переводы этой страницы: English • Deutsch • Español • Italiano • Latviešu • Nederlands • Български • Русский • Українська