Skip to main content

Основы языка V

Это краткое руководство по основным конструкциям языка V для тех, кто только начинает разбираться в языке. Зочем? ¯\(ツ)/¯ .

P.s заголовки кликабельны

Можно онлайн поиграться с языком на официальной площадке Туть или неофициальной Туть#

Ссылка на документацию по основным встроенным модулям языка#

👉 Точка с запятой после команд в V не ставится.

Комментарии#

Комментарии в V бывают двух видов: однострочные и многострочные.

// Это однострочный комментарий, который действует только на той строке, где есть два слеша подряд
/* А это многострочный комментарий.
С помощью звёздочки и слеша можно писать длинные комментарии на несколько строк. Всё, что между ними, — это комментарий */
/*
V также поддерживает
/*
вложенные комментарии
*/
¯\_()_/¯
*/

Структура программы#

Пример простой программы на языке V

fn main() {
println('hello V world!')
}

Объявление fn main() можно пропустить в однофайловых программах. Это полезно при написании небольших программ, "скриптов".

println('hello world')

Переменные, константы и типы данных#

Переменная:

  • изменяемая (может менять значение в любой момент): mut name := value
  • неизменяемая (не может менять значение после объявления): name := value

Константа (определяются вначале программы): const.

Переменные объявляются и инициализируются с помощью :=. Это единственный способ объявления переменных в V - переменные всегда имеют начальное значение.
⠀ Разница между := и = := - объявление и инициализация = - присвоение

/// неизменяемые примеры
// константы
const (
pi = 3.14
world = '世界'
)
// строковая переменная
name := 'Bob'
// целые числа
age := 20
large_number := i64(9999999999)
// дробные числа
year := 21.2
/// изменяемые переменные
mut moon := 20
moon = 21
Требования к названиям переменных
  • Имя не должно содержать заглавных букв, например `AlphaTest`
  • Используйте символы подчеркивания в качестве разделителей, например `hello_world`
  • Название должно быть как можно более описательным
  • Имя не должно содержать `__`
  • Имя не должно содержать пробелов
  • Если имя длиннее 11 символов, то оно должно использовать `_` в качестве разделителя
Чем неизменяемая переменная отличается от константы?)

"переменная без mut" vs "const"

Главное отличие - области видимости:

const xyz = 1 => xyz может использоваться во всех функциях одного и того же модуля.

abc := 1 => abc может быть использован только в вашей текущей функции (локальная переменная)

Также const вычисляется во время компиляции, без mut - объявляется во время присваивания

Как это можно использовать?

Например, константы используются для расчётов таблиц, необходимых для рассчётов хешей, во время компиляции.

А переменные без mut - это в рантайме защита, что переменная больше нигде не переписывается, за счёт чего компилятор может делать оптимизации.

В отличие от времени вычисления, которое в текущей реализации не гарантированно всегда будет comptime для const (те, которые вызывают функции, например, вычисляются в начале вашей программы, а не в comptime)

Ввод и вывод#

Вывод:

  • fn print(s string) ← вывести все на sdtout
  • fn println(s string) ← вывести все на sdtout на новой строке

println это простая, но мощная встроенная функция, которая может печатать что угодно: строки, числа, массивы, карты, структуры.

struct User {
name string
age int
}
println(1) // "1"
println('hi') // "hi"
println([1, 2, 3]) // "[1, 2, 3]"
println(User{ name: 'Bob', age: 20 }) // "User{name:'Bob', age:20}"

Ввод

Чтобы подключить библиотеку os: import os

import os
fn main() {
// прочитать текст из stdin
name := os.input('Enter your name: ')
println('Hello, $name!')
}

Присваивание и сравнение#

Присваивание обозначается одним знаком равно, а проверка на равенство — двумя.

// присваивание
a = 10
b = 42
// сравнение
println(b == 10)
note

:= - объявить

= - присвоить

== - сравнить

Условный оператор if#

id := 'Xenon'
// если условие верное
if id == 'Apple' {
// то выполняем то, что идёт в скобках
println('Введите свой логин и пароль')
// если условие не выполнилось, то можно сразу проверить ещё одно условие
// так можно делать сколько угодно раз
} else if id == 'Google' {
// выводим второй ответ
println('Ваша операционная система не поддерживается')
// выполняем то, что относится к последнему if
} else {
println('Ошибка ввода')
}

Оператор множественного выбора match#

После первого найденного варианта оператор выполняет нужные действия и прекращает работу.

id := 'Xenon'
// перебираем возможные варианты для переменной ID
match id {
// проверяем одно значение
'Apple' { println('Введите свой логин и пароль') }
// проверяем второе значение
'Google' { println('Ваша операционная система не поддерживается') }
// если ничего нужного не нашлось
else { println('Ошибка ввода') }
}

Цикл с предусловием for#

Самый простой цикл — можно объявить только условие, а остальное сделать внутри цикла:

// изменяемая переменная для цикла
mut count := 10
// пока переменная больше 0 — цикл работает
for count > 0 {
// выводим текущее значение переменной
println(count)
// уменьшаем её на единицу
count = count - 1
}

Функции#

При объявлении функции нужно указать:

  • какого типа переменные передаются в функцию как параметры;
  • какого типа данные возвращает функция.
// функция, которая перемножает два числа
// у неё два входных параметра — x и y, дробные числа
// функция возвращает тоже дробное число
fn multiply(x,y f64) f64 { // float - f64
res := x * y
// возвращаем результат работы функции
return res
}
// началась основная функция
fn main() {
// множители
x := 15.0
y := 120.6
// получаем результат работы функции в переменную
mult := multiply(x,y)
// выводим ответ
println(mult)
}

Структуры#

В V нет привычных для ООП классов, но есть структуры. Технически можно использовать структуры для объявления класса и через них создавать новые объекты, но нужно следить за синтаксисом.

Структура — это когда мы объединяем несколько разнородных (или одинаковых) типов данных в одно целое и работаем с ним как с единым объектом. Почти как классы и объекты, только без классов и объектов.

struct Point {
x int
y int
}
mut p := Point{
x: 10
y: 20
}
println(p.x) // Struct fields are accessed using a dot
// Alternative literal syntax for structs with 3 fields or fewer
p = Point{10, 20}
assert p.x == 10