Курс языка программирования 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.
Заключение
Итог: чтобы избежать таких проблем, не добавляйте пробел между именем функции и скобками с аргументами функции и старайтесь избегать скобок, если это возможно, с другими конструкциями языка, такими как управляющие конструкции.
Навигация по курсу
← Больше о функциях | Типизированные параметры →
💪 Или перейдите сразу к
упражнению этого раздела.