Szukaj…


Wprowadzenie

Chociaż nie ma oficjalnego przewodnika po stylu Rust, poniższe przykłady pokazują konwencje przyjęte przez większość projektów Rust. Przestrzeganie tych konwencji dostosuje styl twojego projektu do standardowej biblioteki, ułatwiając ludziom dostrzeżenie logiki w twoim kodzie.

Uwagi

Oficjalne wytyczne dotyczące stylu Rust były dostępne w repozytorium rust-lang/rust na GitHub, ale zostały niedawno usunięte, w oczekiwaniu na migrację do repozytorium rust-lang-nursery/fmt-rfcs . Dopóki nie zostaną tam opublikowane nowe wytyczne, powinieneś postąpić zgodnie z nimi w repozytorium rust-lang .

Możesz użyć rustfmt i clippy, aby automatycznie przejrzeć kod pod kątem problemów ze stylem i sformatować go poprawnie. Te narzędzia można zainstalować za pomocą Cargo, w ten sposób:

cargo install clippy
cargo install rustfmt

Aby je uruchomić, używasz:

cargo clippy
cargo fmt

Biała przestrzeń

Długość linii

// 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!";

Wcięcie

// 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);
    }
}

Końcowe białe znaki

Końcowe białe znaki na końcu plików lub wierszy powinny zostać usunięte.

Operatory binarne

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

Dotyczy to również atrybutów, na przykład:

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

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

Średniki

// 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;

Wyrównanie pól konstrukcyjnych

// 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
}

Sygnatury funkcji

// 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!
}

Szelki

// 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 }

Tworzenie skrzyń

Preludia i powrotny eksport

// 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;

Czasami skrzynki używają modułu prelude do przechowywania ważnych struktur, podobnie jak std::io::prelude . Zazwyczaj są one importowane przy use std::io::prelude::*;

Import

Powinieneś zamówić import i deklaracje w następujący sposób:

  • extern crate deklaracje dotyczące extern crate
  • use importu
    • Import zewnętrzny z innych skrzyń powinien być na pierwszym miejscu
  • Reeksport ( pub use )

Nazewnictwo

Struktury

// 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 {
        
    }
}

Cechy

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

Skrzynie i moduły

// 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 {

    }
}

Zmienne statyczne i stałe

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

Enums

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

Funkcje i metody

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

}

Zmienne powiązania

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

Lifetimes

// 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
}

Akronimy

Nazwy zmiennych zawierające akronimy, takie jak TCP powinny mieć następującą styl:

  • W przypadku nazw UpperCamelCase pierwsza litera powinna być TcpClient wielkimi literami (np. TcpClient )
  • W snake_case nazw snake_case nie powinno być wielkich liter (np. tcp_client )
  • Dla SCREAMING_SNAKE_CASE imion, akronim powinien być całkowicie skapitalizowane (np TCP_CLIENT )

Rodzaje

Wpisz adnotacje

// 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();

Bibliografia

// 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow