LoginSignup
85
62

More than 5 years have passed since last update.

Rustでよく見かけるattributeを整理する。

Last updated at Posted at 2016-12-31

これはRust その2 Advent Calendar 2016 15日目の記事です。
公開が遅れてしまったため、日付と記事公開日は合っていません。

このエントリではRustのmod、crateなどに対するメタデータであるアトリビュートについて整理した。
アトリビュートの書き方は大きく分けて下記の2つがある。

  • !を入れると囲んでいるアイテムへの適用
mod foo {
    #![foo]
}
  • !がない書き方だと次の宣言への適用
#[bar]
struct bar;

crate_type, crate_name

crate_typeアトリビュートは、そのクレイトがライブラリ、バイナリのいずれにコンパイルされるべきかをコンパイラに伝えるために使用。
crate_nameはクレイトの名前を決定するのに使用。

#![crate_type = "lib"]
#![crate_name = "rary"]

crate_type宣言しておけば、コンパイル時に--crate-typeフラグを付ける必要がない。
crate_typeの一覧はこちら

$ rustc lib.rs
$ ls lib*
library.rlib

feature

主にnightlyの機能を実装する際、下記のような設定でfeature機能を使える。

#![feature(feature1, feature2, feature3)]

指定できる値の一覧はこちら

allow

lintチェックをエラーにせず、許容するアトリビュートです。以下の2種類を紹介する。

#[allow(dead_code)]
fn unused_function() {}

コンパイラは使用されていない関数が存在するときに警告を出す。
dead_codeによってこの機能を無効化することができる。

#[allow(non_camel_case_types)]
type int8_t = i8;

typeエイリアスはCamelCaseで書くことが推奨されていますが、それ以外の書き方をしたい場合には non_camel_case_typesで警告を無効化できる。

test

test_foo関数テストを走らせた時に実行されるというテスト関数になる。
通常通りにコンパイルをした場合は、コンパイル結果に含まれない。

#[test]
fn test_foo(){
    /* ... */
}

macro_use

全てのマクロがロードされる。
extern crateの上で利用すると、外部のクレートからどのマクロをロードするのかを指定できる。

#[macro_use(hoge, fuga)]
extern crate foo;

derive

毎回Debugなどのトレイトを実装するを避けるために、自動的にトレイトを実装するためのderiveアトリビュートがある。
コンパイラには、deriveアトリビュートを用いることで型に対して特定のトレイトの標準的な実装を提供できる。

#[derive(Debug)]
struct Foo;

fn main() {
    println!("{:?}", Foo);
}

標準で実装されているトレイトは以下の一覧。

cfg

同じコードで複数の環境に合わせてコンパイル結果を得たい時は、cfgアトリビュートでコンパイラにフラグを渡すことが出来る。

#[cfg(target_os="linux")]
fn target_on_linux(){
    println!("Running linux.")
}

#[cfg(not(target_os = "linux"))]
fn no_target_on_linux(){
    println!("Not running linux.")
}

条件を独自に追加する場合は--cfgフラグを用いてコンパイラに伝える必要がある。

#[cfg(feature = "nightly")]
fn conditional_function() {
    println!("condition met!")
}
$ rustc --cfg nightly custom.rs

cfg!

cfg!マクロではコード中にフラグを利用することができる。
コンパイル時にtrueかfalseを返す。

if cfg!(target_os = "linux") {
    println!("Yes. It's definitely linux!");
} else {
    println!("Yes. It's definitely *not* linux!");
}

cfg_attr

cfg_attr を用いることで、cfg に設定された値によってアトリビュートを有効にすることが出来る。
cfg アトリビュートによって a が有効になっている場合に限り #[b] と設定されている 場合と同じ意味。

#![cfg_attr(feature="clippy", feature(plugin))]
85
62
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
85
62