Поскольку мы следуем порядку в Введение в Goприменительно кVlang, сегодняшняя глава — шестая, Функции, которая для функциональный программист, как это, вероятно, самая захватывающая глава.
Функции
Функции в V работают следующим образом:
Сначала мы определяем тело функции.
fn my_function() { }
Обратите внимание, что мы используем соглашение о змеином регистре в V, в отличие от случая верблюда Go или случая Pascal при работе с функциями модуля.
Если у нашей функции есть параметры, мы можем определить их, введя их идентификаторы и соответствующие им типы:
fn my_function(x int, y bool) { }
Если типы наших параметров одинаковы, мы можем сделать как Go и выразить следующее:
fn my_function(x, y int) { }
Если нам нужно что-то вернуть, мы должны указать тип возвращаемого значения после символа закрывающей скобки.
fn my_function(x, y int) int { return x+y }
И в случае, если мне нужно переменное количество параметров, V также поддерживает вариативные функции.
fn my_function(args ...int) { for arg in args { println(arg) } }
Или, если мне нужно закрытие:
fn my_function() fn(int, int) int { return fn(x, y int) int { return x + y } }
Я даже могу каррировать функции:
fn curry_sum(x int) fn(int) int { return fn [x] (y int) int { return x+y } }
Обратите внимание, что мне пришлось использовать [x], чтобы указать внутренней функции, которую я хочу использовать переменные, объявленные во внешней области.
V также поддерживает рекурсию, и это очень просто:
fn recursion_it(times int) int { if times > 0 { return times + recursion_it(times-1) } return 0 }
Рекурсивная функция, которая суммирует полученные параметры при обратном отсчете количества вызовов.
указатели
Поскольку Go V также имеет очень похожий подход к указателям, но у него есть несколько отличий, которые мы рассмотрим ниже, а пока попробуйте, как это работает:
fn main() { mut x := 5 zero(mut &x) println(x) //should be 0 } fn zero(mut xptr &int) { xptr = 0 }
Основное отличие состоит в том, что для передачи точки в качестве параметра я не использую «*» в нулевой функции, а использую «&», а вторая деталь заключается в том, что для работы с указателями я должен объявить значение I Я работаю как mut, когда я объявляю x, вызываю ноль в main и объявляю указатель в качестве параметра, иначе он выдаст ошибку, потому что константы не могут быть изменены.
Он немного меняется, но очень похож на то, что есть в Go.
Упражнения
- Напишите функцию, которая принимает целое число, делит его пополам и возвращает true, если оно четное, или false, если оно нечетное. Например, половина (1) должна возвращать (0, ложь), а половина (2) должна возвращать (1, истина).
- Напишите функцию с одним переменным параметром, которая находит наибольшее число в списке чисел.
- Напишите функцию make_odd_generator, которая генерирует нечетные числа.
И мы это сделали, еще одна глава готова!
Мы успешно изучили, как работают функции в V, и продолжили эту серию, надеемся увидеть вас в следующей статье!