Курс языка программирования Raku / Основы / Больше о функциях

Мульти-функции

Raku реализует множественную диспетчеризацию на основе сигнатуры функции. Это позволяет создавать функции, которые имеют одно и то же имя, но принимают разные типы входных данных. Используйте декларатив multi для каждой из вариантов функции.

multi sub add(Int $x, Int $y) { $x + $y }
multi sub add(Str $x, Str $y) { $x ~ $y }

(Можно опустить sub после multi.)

Если у вас есть два варианта одной и той же функции, компилятор выполняет множественную диспетчеризацию в зависимости от того, какие аргументы он видит в вызове функции. Сравните следующие два вызова:

say add(10, 20); # 30
say add('10', '20'); # 1020

Первый вызов запускает функцию с целочисленными параметрами, в то время как второй вызов запускает второй вариант функции, который ожидает две строки.

Литеральные параметры

Интересный случай для многофункций — это наличие вариантов, которые имеют литеральные значения в качестве параметров. Рассмотрим следующие два варианта:

multi sub f(42) {say 'Это ответ'}
multi sub f($x) {say "$x не является ответом"}

Первый вариант выполняется только тогда, когда вы вызываете функцию с точным значением 42. В других случаях используется второй вариант. Порядок, в котором эти функции определены, не имеет значения.

f(10); # 10 не является ответом
f(42); # Это ответ

Навигация по курсу

Больше о функциях / Тип возвращаемого значения   |   💪 Упражнение: Факториал с мульти-функциями

Эта страница автоматически переведена с помощью ChatGPT 4o. Оригинальный текст на английском языке.

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