Skip to content

Базовые правила форматирования


§1 Отступы

§1.1 Ширина отступа. По умолчанию используется отступ в 4 пробела. Можно изменить через параметр конфигурации indent_width.

// Отступ по умолчанию (4 пробела)
fn foo() {
    let x = 1;
    if x > 0 {
        print(x);
    }
}

// Отступ в 2 пробела (indent_width = 2)
fn foo() {
  let x = 1;
  if x > 0 {
    print(x);
  }
}

§1.2 Табуляция. Когда use_tabs = true, используется символ табуляции. По умолчанию false.

§1.3 Согласованность отступов. В одном файле нельзя смешивать табуляцию и пробелы.


§2 Ширина строки

§2.1 Максимальная ширина строки. По умолчанию максимальная ширина строки составляет 120 символов. Можно изменить через параметр конфигурации line_width.

§2.2 Стратегия переноса строк. Когда строка превышает максимальную ширину, необходимо сделать перенос в подходящем месте. Приоритет позиций переноса:

  1. После операторов низкого приоритета (+, -, ||, &&, =)
  2. После списка аргументов функции
  3. После элементов списков/словарей
  4. После операторов высокого приоритета (*, /, %, ==, !=)

§2.3 Отступ при переносе. После переноса необходимо добавить один уровень отступа.

// При превышении ширины строки
let result = very_long_variable_name + another_long_name + yet_another_long_name;

// После форматирования
let result = very_long_variable_name
    + another_long_name
    + yet_another_long_name;

§3 Операторы

§3.1 Пробелы вокруг операторов. Двоичные операторы должны быть окружены пробелами с обеих сторон.

// ✅ Правильно
let x = 1 + 2;
let y = a == b;

// ❌ Неправильно
let x = 1+2;
let y = a==b;

§3.2 Унарные операторы. Между унарным оператором и операндом пробел не ставится.

// ✅ Правильно
let x = -1;
let y = !flag;
let z = *ptr;

// ❌ Неправильно
let x = - 1;
let y = ! flag;

§3.3 Перенос при низкоприоритетных операторах. Когда выражение превышает ширину строки, операторы низкого приоритета помещаются в начало новой строки.

// При превышении ширины строки
let result = first_value + second_value + third_value + fourth_value;

// После форматирования
let result = first_value
    + second_value
    + third_value
    + fourth_value;

§3.4 Перенос при высокоприоритетных операторах. Операторы высокого приоритета помещаются в начало новой строки.

// При превышении ширины строки
let result = first_value * second_value / third_value % fourth_value;

// После форматирования
let result = first_value
    * second_value
    / third_value
    % fourth_value;

§3.5 Ссылки на переменные

§3.5.1 Имена переменных. При ссылке на переменную выводится только её имя без дополнительных пробелов.

// ✅ Правильно
let x = my_variable;
let y = camelCaseName;

// ❌ Неправильно
let x = my_variable ;  // лишний пробел
let y = "camelCaseName";  // не должно быть кавычек

§6 Блоки кода

§6.1 Формат блоков кода. Блоки кода заключаются в фигурные скобки {}, перед открывающей скобкой ставится пробел.

// ✅ Правильно
fn foo() {
    let x = 1;
}

// ❌ Неправильно
fn foo(){
    let x = 1;
}
fn foo()
{
    let x = 1;
}

§6.2 Однострочные блоки кода. Когда блок кода содержит только одну строку и общая длина не превышает ширину строки, можно использовать однострочный формат.

// ✅ Однострочный формат
fn foo() { 1 }

// ✅ Многострочный формат
fn foo() {
    let x = 1;
    let y = 2;
    x + y
}

§6.3 Пустые блоки кода. Пустой блок кода записывается как {}.

// ✅ Правильно
fn foo() {}

// ❌ Неправильно
fn foo() {
}