アトリビュート

Rustでは以下のように「アトリビュート」によって宣言を修飾することができます。

fn main() { #[test] fn foo() {} }
#[test]

または以下のように:

fn main() { mod foo { #![test] } }
#![test]

2つの違いは ! に有ります、 ! はアトリビュートが適用されるものを変更します:

fn main() { #[foo] struct Foo; mod bar { #![bar] } }
#[foo]
struct Foo;

mod bar {
    #![bar]
}

#[foo] アトリビュートは次のアイテムに適用され、この場合は struct 宣言に適用されます。 #![bar] アトリビュートは #![bar] アトリビュートを囲んでいるアイテムに適用され、この場合は mod 宣言に適用されます。 その他の点については同じであり、どちらも適用されたアイテムの意味を変化させます。

例を挙げると、たとえば以下の様な関数では:

fn main() { #[test] fn check() { assert_eq!(2, 1 + 1); } }
#[test]
fn check() {
    assert_eq!(2, 1 + 1);
}

この関数は #[test] によってマークされており、これは テスト を走らせた時に実行されるという特別な意味になります。 通常通りにコンパイルをした場合は、コンパイル結果に含まれません。この関数は今やテスト関数なのです。

アトリビュートは以下のように、追加のデータを持つことができます:

fn main() { #[inline(always)] fn super_fast_fn() { } }
#[inline(always)]
fn super_fast_fn() {

また、キーと値についても持つことができます:

fn main() { #[cfg(target_os = "macos")] mod macos_only { } }
#[cfg(target_os = "macos")]
mod macos_only {

Rustのアトリビュートは様々なことに利用されます。 すべてのアトリビュートのリストは リファレンス に載っています。 現在は、Rustコンパイラによって定義されている以外の独自のアトリビュートを作成することは許可されていません。