

タイトルにあるとおり、rustの `#[xxx]` や `#![xxx]` はどういう意味ですか？

たとえば  
<https://rocket.rs/>  
こちらのサンプルコードにもあるようなものです。

[code]

    #![feature(proc_macro_hygiene, decl_macro)]
    
    #[macro_use] extern crate rocket;
    
    #[get("/hello/<name>/<age>")]
    fn hello(name: String, age: u8) -> String {
        format!("Hello, {} year old named {}!", age, name)
    }
    
    fn main() {
        rocket::ignite().mount("/", routes![hello]).launch();
    }
    
[/code]

記号での検索は調べ方が難しくこれらに名前がついていれば合わせて教えていただけると幸いです。  
また、普段RubyやJavaScriptを使っているので、それらに類似している機能があればおしえてください。

よろしくおねがいします。


CC BY-SA 4.0
2020-11-21T05:48:14.853
72114
2020-11-21T06:18:15.890
32878
question
rust
rustの#[xxx]や#![xxx]はどういう意味ですか？


`#![hoge]`のようなものはInner attributeと呼ばれるもので、そのスコープに属性を付与するものです。  
例えば、示されたコードにある`#![feature(proc_macro_hygiene,
decl_macro)]`は、「このスコープで、不安定機能`proc_macro_hygiene`と`decl_macro`を有効にする」という意味を持ちます。

`#[fuga]`のようなものはOuter attributeと呼ばれるもので、直後のアイテムに属性を付与するものです。  
例えば、示されたコードにある`#[get("/hello/<name>/<age>")]`は、「直後のアイテム（この場合は関数`hello`)を指定URLのハンドラとして登録する」という意味を持ちます。  
(蛇足ですが、この`get`というattributeはattribute-like macroという言語機能でRocketが独自に定義しているものです)

自分も今知ったのですが、Rustでよく出てくる記号や演算子はThe bookのappendixにまとめられているようです。ご参考までに。  
<https://doc.rust-lang.org/book/appendix-02-operators.html>


CC BY-SA 4.0
2020-11-21T06:18:15.890
72116
2020-11-21T06:18:15.890
8826
72114
answer