はじめに

Rustの基本的な文法についてまとめてみた。第9回。
今回のテーマは「アトリビュート」について.

目的

Rustにおける基本的な構文の理解をする。

Rustの基本構文シリーズ

第4回⇒Rustの基本構文(4)  URL: https://qiita.com/jin237/items/42249f984746711be0e2
第5回⇒Rustの基本構文(5)  URL:https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒Rustの基本構文(6)  URL:https://qiita.com/jin237/items/903e33226f93e7a4e5a0
第7回⇒Rustの基本構文(7)  URL:https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d
第8回⇒Rustの基本構文(8)  URL:https://qiita.com/jin237/items/d544edcdfc7a08fa6998

アトリビュート(attribute)

日本語にすると、「属性、特性」の意味を持つ。ただ、Rust上では、アイテム宣言にメタデータを付けるためのもの。
2つの書き方がある。
・対象となるものより先に書く
・対象の中に書く
この書き方によってそれぞれ形も変わってくる。

//対象となるものより先に書く
#[attribute]
//例(対象となるものより先に書く)
#[test]
fn test1(){
   本体
}

//対象の中に書く
#![attribute]
//例(対象の中に書く)
fn test2(){
   #![test]
   //本体
}

のようにして書く。testアトリビュートは関数につけることのできるアトリビュートで、この関数はRustのコンパイラに–testというオプションを渡したときにだけ、コンパイルされる仕組みになっている。

ここで様々アトリビュートに関することを説明していく。

様々なアトリビュート

今回使用率の高いものを紹介していく。以下のもの。
・testアトリビュート(上記紹介より省略)
・cfgアトリビュート
・deriveアトリビュート
・allowアトリビュート
・denyアトリビュート

cfgアトリビュート

条件によって、コンパイルするかどうかを決めることができる。

例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.245)

//ターゲットのOSがUnix系の場合にだけコンパイルする。
#[cfg(unix)]
fn something_for_unix(){
   //本体は省略
}

//ターゲットのOSがWindowsの場合にだけコンパイルする。
#[cfg(windows)]
fn something_for_windows(){
   //本体は省略
}

–testオプションのように、–cfgオプションでコンフィグレーションオプションをRustコンパイラに渡すこともできる。

deriveアトリビュート

deriveアトリビュートに対応したトレイトの実装を自動的に構造体や列挙型に実装してもらえる。

//Point構造体にDebugトレイトが自動的に実装される
#[derive(Debug)]
struct Point{
    x: i32,
    y: i32,
    z: i32,
}

fn main(){
    let some_point = Point {x: 10, y: 20, z: 0};
    //Debugトレイトのfmt関数が自動的に実装されているので、:?フォーマット文字列をつかうことができる。
    println!("Debug: {:?}", some_point);
}

結果

[Running] cd "c:\Users\[username]\rust\project1\" && rustc derive_attribute.rs && "c:\Users\[username]\rust\project1\"derive_attribute
Debug: Point { x: 10, y: 20, z: 0 }

[Done] exited with code=0 in _.___ seconds

これより正常に動いた。詳細については別記事にて説明。

allowアトリビュートとdenyアトリビュート

リントチェックを制御するためのアトリビュートである。
・allowで指定されたリントチェックは無視されるようになる。
・denyで指定されたリントチェックはエラーとして扱いを受ける。

さいごに

アトリビュートについては、わからない人も多いと思うが、これから使っていける機会があれば積極的に使えるようにソースコードに混ぜるなどしていきたい。

广告
将在 10 秒后关闭
bannerAds