Поиск…


Вступление

Несмотря на отсутствие официального руководства по стилю Rust, следующие примеры показывают соглашения, принятые большинством проектов Rust. Следуя этим соглашениям, вы сравните стиль вашего проекта со стилем стандартной библиотеки, что упростит для людей возможность увидеть логику вашего кода.

замечания

Официальные правила стиля Руста были доступны в репозитории rust-lang/rust на GitHub, но они были недавно удалены, до перехода в репозиторий rust-lang-nursery/fmt-rfcs . Пока новые руководящие принципы не будут опубликованы там, вы должны попытаться следовать рекомендациям в репозитории rust-lang .

Вы можете использовать rustfmt и clippy для автоматического просмотра кода для проблем стиля и правильного его форматирования. Эти инструменты могут быть установлены с использованием Cargo, например:

cargo install clippy
cargo install rustfmt

Чтобы запустить их, вы используете:

cargo clippy
cargo fmt

Пробелы

Длина линии

// Lines should never exceed 100 characters. 
// Instead, just wrap on to the next line.
let bad_example = "So this sort of code should never really happen, because it's really hard to fit on the screen!";

вдавливание

// You should always use 4 spaces for indentation. 
// Tabs are discouraged - if you can, set your editor to convert
// a tab into 4 spaces.
let x = vec![1, 3, 5, 6, 7, 9];
for item in x {
    if x / 2 == 3 {
        println!("{}", x);
    }
}

Прокручивание пробелов

Замыкание пробелов в конце файлов или строк должно быть удалено.

Двоичные операторы

// For clarity, always add a space when using binary operators, e.g.
// +, -, =, *
let bad=3+4;
let good = 3 + 4;

Это также относится к атрибутам, например:

// Good:
#[deprecated = "Don't use my class - use Bar instead!"]

// Bad:
#[deprecated="This is broken"]

Точка с запятой

// There is no space between the end of a statement
// and a semicolon.

let bad = Some("don't do this!") ;
let good: Option<&str> = None;

Выравнивание полей структуры

// Struct fields should **not** be aligned using spaces, like this:
pub struct Wrong {
    pub x  : i32,
    pub foo: i64 
}

// Instead, just leave 1 space after the colon and write the type, like this:
pub struct Right {
    pub x: i32,
    pub foo: i64
}

Функциональные подписи

// Long function signatures should be wrapped and aligned so that
// the starting parameter of each line is aligned
fn foo(example_item: Bar, another_long_example: Baz, 
       yet_another_parameter: Quux) 
       -> ReallyLongReturnItem {
    // Be careful to indent the inside block correctly!
}

фигурные скобки

// The starting brace should always be on the same line as its parent.
// The ending brace should be on its own line.
fn bad()
{
    println!("This is incorrect.");
}

struct Good {
    example: i32
}

struct AlsoBad {
    example: i32 }

Создание ящиков

Прелюдии и реэкспорт

// To reduce the amount of imports that users need, you should
// re-export important structs and traits.
pub use foo::Client;
pub use bar::Server;

Иногда ящики используют модуль prelude для хранения важных структур, как std::io::prelude . Обычно они импортируются с use std::io::prelude::*;

импорт

Вы должны заказать свой импорт и декларации следующим образом:

  • объявления extern crate
  • use импорт
    • Внешний импорт из других ящиков должен быть первым
  • Реэкспорт ( pub use )

Именование

Структуры

// Structs use UpperCamelCase.
pub struct Snafucator {
    
}

mod snafucators {
    // Try to avoid 'stuttering' by repeating 
    // the module name in the struct name.

    // Bad:
    pub struct OrderedSnafucator {
    
    }
      
    // Good:
    pub struct Ordered {
        
    }
}

Черты

// Traits use the same naming principles as 
// structs (UpperCamelCase).
trait Read {
    fn read_to_snafucator(&self) -> Result<(), Error>;
}

Ящики и модули

// Modules and crates should both use snake_case.
// Crates should try to use single words if possible.
extern crate foo;
mod bar_baz {
    mod quux {

    }
}

Статические переменные и константы

// Statics and constants use SCREAMING_SNAKE_CASE.
const NAME: &'static str = "SCREAMING_SNAKE_CASE";

Перечисления

// Enum types and their variants **both** use UpperCamelCase.
pub enum Option<T> {
   Some(T),
   None
}

Функции и методы

// Functions and methods use snake_case
fn snake_cased_function() {

}

Переменные привязки

// Regular variables also use snake_case
let foo_bar = "snafu";

Время жизни

// Lifetimes should consist of a single lower case letter. By 
// convention, you should start at 'a, then 'b, etc.

// Good:
struct Foobar<'a> {
    x: &'a str
}

// Bad:
struct Bazquux<'stringlife> {
    my_str: &'stringlife str
}

Сокращения

Имена переменных, содержащие аббревиатуры, такие как TCP должны быть написаны следующим образом:

  • Для имен UpperCamelCase первая буква должна быть заглавной (например, TcpClient )
  • Для имен snake_case не должно быть капитализации (например, tcp_client )
  • Для имен SCREAMING_SNAKE_CASE аббревиатура должна быть полностью заглавной (например, TCP_CLIENT )

Типы

Тип аннотации

// There should be one space after the colon of the type
// annotation. This rule applies in variable declarations,
// struct fields, functions and methods.

// GOOD:
let mut buffer: String = String::new();
// BAD:
let mut buffer:String = String::new();
let mut buffer : String = String::new();

Рекомендации

// The ampersand (&) of a reference should be 'touching'
// the type it refers to.

// GOOD:
let x: &str = "Hello, world.";
// BAD:
fn fooify(x: & str) {
    println!("{}", x);
}

// Mutable references should be formatted like so:
fn bar(buf: &mut String) {

}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow