Rustを学習する
#[~~] アトリビュート
アトリビュートはモジュール、クレート、要素に対するメタデータです。以下がその使用目的です。
- コンパイル時の条件分岐
- クレート名、バージョン、種類(バイナリか、ライブラリか)の設定
- リントの無効化
- コンパイラ付属の機能(マクロ、グロブ、インポートなど)の使用
- 外部ライブラリへのリンク
- ユニットテスト用の関数を明示
- ベンチマーク用の関数を明示
関数やmoduleの上にある#[cfg~~]
等はアトリビュートでメタデータを指定している。
ink!の#[ink(contract)]
もアトリビュートと言えよう。
trait トレイト
traitとimplの使い分けが難しい。両方、structに対してinterfaceのようになっている。
! マクロ
println!
vec!
はマクロを使っているので、!
をつけている。
学習
Rustの基本的な書き方は、
書き方は他の言語と変わりないので、
でサッと学ぶのも良い。
しかし、他のコードを読むと、当たり前のように!や#[~~]が出てきて、それが何なのかを理解しないと、読むことが厳しい。
書き方の例
webassembly
cfg
状況に応じたコンパイルをするためのもの。
// This function only gets compiled if the target OS is linux // この関数はターゲットOSがLinuxの時のみコンパイルされる。 #[cfg(target_os = "linux")] fn are_you_on_linux() { println!("You are running linux!"); } ~~~~
std feature が有効化されていないとき、コンパイラに std ライブラリを使わないよう伝える。 これはクレー>ト全体に反映されるべき設定なので #![] で書く
// #![cfg_attr(not(feature = "std"), no_std)]
引用元・参考
webassembly(WASM)の学習
上記に従って進めていく。
use of unstable library feature 'bool_to_option' エラー
cargo install cargo-generator
で上記のエラーになる。(rustc 1.61.0)
rustのバージョンを最新にすると解決した。(rustc 1.65.0)
$ rustup update
$ cargo -version
$ rustc -V
$ rustup -V
ドキュメンテーションコメント
/// コメント
でドキュメンテーションコメントを書くことが出来る
vscode でuse を使用しても補完が効かない
extern crate
を使うと良い。
extern crate hoge;
use hoge::hoge;
ただ、もう使わなくてもいいらしい。
mod hoge {}
を使うと、そのままuse
で行ける。
ただ、私の環境だと、lib.rsにmod hoge;
と書かないと補完が効かなかった。
あとは環境変数の設定が間違っているとか
$ rustc --print sysroot
/~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu
pub use について
use crate::hoge
でmodで定義されたものを展開してくれる。
pub use
はそれをさらに外から使えるようにしてくれる。
Option<T>
Option 型はオプションの値を表します。すべての Option は Some で値を含むか、 None で値を含まないかのどちらかです。Option型はRustのコードでは非常によく使われます。
引用:訳
typescriptとかの<String | undefined>
みたいな感じ。
未登録時はNoneにしたいときとか。
unwrap()
Option<T>での返り値はsome(x) or None()であり、some(x)からxを取り出すときにunwrap()を使用する
Cargoについて
rustのパッケージマネージャ。yarnみたいなもの。
cargo clean
ビルドとかきれいにしてくれる
cargo run
ビルドして実行する
cargo build
ビルドする
cargo build --release
最適化してビルドする