サーチ…


前書き

公式のRustスタイルガイドはありませんが、以下の例は、ほとんどのRustプロジェクトで採用されている規約を示しています。これらの規則に従って、プロジェクトのスタイルを標準ライブラリのスタイルに合わせることで、コード内のロジックを人々が見やすくすることができます。

備考

公式のRustスタイルのガイドラインはGitHubのrust-lang/rustリポジトリで入手できましたが、 rust-lang-nursery/fmt-rfcsリポジトリへ移行するまで、最近削除されました。そこに新しいガイドラインが掲載されるまでは、 rust-langリポジトリのガイドラインに従ってください。

rustfmtclippyを使用すると、スタイルの問題のコードを自動的に確認し、正しくフォーマットすることができます。これらのツールは、次のように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;

時には、cratesはstd::io::preludeように重要な構造体を含むためにpreludeモジュールを使います。通常、これらはuse std::io::prelude::*;use 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