Курс Раку / Основи / Більше про функції

Зверніть увагу на пробіли

Використання функцій у Raku здебільшого інтуїтивне і не викликає проблем, але ви повинні бути попереджені про наступний аспект.

Коротко

Не додавайте пробіл між назвою функції та дужками з її аргументами. Але використовуйте пробіл після 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БългарскиРусскийУкраїнська