Variable number of arguments (Swift / С++ / Ruby)

Variable number of arguments

В очередной раз пытаюсь начать изучать Swift. И в очередной раз натыкаюсь на совершенно странные на мой взгляд вещи. Вот например, в Swift есть параметры функций переменной длины. Берем пример прямо из книги от эплов о свифте:
Swift sum
Вроде-бы все красиво, функция принимает любое количество аргументов и превращает их в массив, с которым работать просто и приятно. Не нужно никаких сишных va_list и т.д.

НО

Дальше в книге просят написать функцию, которая посчитает среднее параметров. Вроде-бы все хорошо, сумма у нас уже есть. Нужно поделить сумму на количетво элементов.
Пробуем:
И тут оказывается, что функция sum не может принять наши args как аргументы. И xcode как-то очень туманно нас подводит к этой мысли:

error: '[Int]' is not convertible to 'Int'

 Так и хочется сказать WAT ?

Начинаем гуглить, и оказывается, что это не баг, а фича. Поскольку список аргуметнов превращается в массив, то просто так передать его в функцию, которая принимает список аргументов нельзя. Единственный вариант - это создать еще одну функцию, которая будет принимать на вход массив:


И вот теперь, мы можем написать функцию для подсчета средних значений:
Задача решена, все работает, но интересно, как та-же задача решается на других языках?

С++

Решение на C++ самое  запутанное из всех. С помощью шаблонов мы создаем всю цепочку функций,  которые суммируют свой первый аргумент, со вторым и так, пока в цепочке параметров не останется ничего. Классическая функциональщина, но только происходит она во время компиляции, а не при исполнении.

Ну и победитель по простоте и лаконичности:

Ruby


Комментарии

Популярные сообщения из этого блога

Алгоритм NEAT. Эволюционирующие нейронные сети возрастающих топологий.

Цепи Маркова простыми словами. Пишем пирожки.