Поскольку мы следуем порядку в Введение в 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, которая генерирует нечетные числа.

‹- ГЛАВА 5

И мы это сделали, еще одна глава готова!

Мы успешно изучили, как работают функции в V, и продолжили эту серию, надеемся увидеть вас в следующей статье!