Rust入門

同僚の人に「Rustっておもしろい?」と聞かれて気になったので、ここやってみる。
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/
しかしだ。twitter検索してみたら

2012年02月06日(月)
Rustのclosureって全然closureじゃない気がするんだけど。upvarアクセスそのままでは出来ないようだし。どこがpythonと違うのよ。これは単に僕の理解が足りないだけ?
posted at 18:56:23 削除

2月6日@tkuro11
Rust, 流石に type str=int とかは単に無視かw。Naggingかよ。せめて怒ってよw
posted at 18:04:55 削除

2012年02月01日(水)2 tweetssource
2月1日@tkuro11
Rust, writer_utilとかナニモノ
posted at 16:54:06 削除

2月1日@tkuro11
焼けてきたtkuro11@tkuro11

合成と一致検証の合間にRustコンパイルするなど。
posted at 16:26:48 削除

5年も前にやってたらしく、完全に忘れている自分に旋律戦慄などした。

環境構築

まずはインストール。
流行りのshellダイレクトインストール(と僕が勝手に呼んでいる)方法がサポートされているようで精神衛生上よろしいのでこれにする。

 % curl -sSF https://sh.rustup.rs | sh

なんでこれが好きかというとこれって覚えやすいのでどこに行っても使えるから、です。
これで rustc とか cargo(ビルドシステム)がインストールされる。

 % source ~/.cargo/env

するとパスとかの環境変数設定が完了。いや、とかじゃなくて中身見てみると本当にパスの設定しかしていないw
さらにvim用の環境をこさえる。ここを参考にした。
http://qiita.com/hinagishi/items/f43538ce8120e483077e

cargo install --git 'https://github.com/phildawes/racer.git'
cargo install --git https://github.com/rust-lang-nursery/rustfmt

結構時間かかる。racerは補完のため。rustfmtは自動整形のため。
わあ楽チンと思ったのもつかの間。rustfmtの方でみょーなエラーにひっかかる

error[E0554]: #[feature] may not be used on the stable release channel
  --> /home/tkuro/.cargo/git/checkouts/rustfmt-5390e0ead582d971/a1fd68d/src/lib.rs:11:1
   |
11 | #![feature(rustc_private)]
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^

よくわかんないけど、nightly buildじゃないとアカンということかな。というわけでrustupでコンパイラを入れ替える。

 % rustup install nightly
 % rustup default nightly

rust version 1.22.0-nightly (368122087 2017-09-06)になった。
あ、よく考えたらnightlyまでいかんでもbetaでいいのか・・・
以下でも行けるみたいだけど overrideって何を上書きするんだろう。あとで調べよう

 % rustup override set nightly

とりあえずこれでコード補完とシンタックスハイライト、自動整形までおk

その他気になるもの

Compiling aho-corasick v0.6.3

なんだろうこれ

コード書く

までもなく cargoで自動生成するとテンプレートが生成される。

 % cargo new --bin hero_world
 % cd hero_world
 % cargo run 
   Compiling hero_world v0.1.0 (file:///home/tkuro/Rust/hero_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31 secs
     Running `target/debug/hero_world`
Hello, world!
 % cat src/main.rs
fn main() {
    println!("Hello, world!");
}

全然前のこと思い出せないけど、あまりきれいな言語じゃないなー。!は関数じゃなく
マクロなんだそうな。

cargoの作ってくれるテンプレートは プロジェクトルートに src/があってこの中の
main.rsがエントリポイント(おそらくルートのCargo.tomlで変えられるんだろう)。
cargo build とか runとかすると target/debugとかにバイナリが生成される。

生成物でかい

swordfish% ls -l target/debug/hero_world  
-rwxr-xr-x 2 tkuro tkuro 3885344  9月  8 07:45 target/debug/hero_world*

言語にダイブするのは次のエントリで。

まとめ

  • 結構簡単に環境が構築できる
  • rustupのおかげで環境の管理が簡単
  • cargoがモダンな感じに開発をサポートしてくれる。
  • 言語はどうも省略形が多いが、アノテーションとか#で簡単そう