2016年から始めるRust  on OSX10.11.5

## Install

```bash:compile_install
$ curl -sSf https://static.rust-lang.org/rustup.sh | sh
```

確認

```bash
$ rustc --version
rustc 1.9.0 (e4e8b6668 2016-05-18)

$ cargo --version
cargo 0.10.0-nightly (10ddd7d 2016-04-08)
```

Editorの機能を使うためにソースコードもダウンロードします。

https://www.rust-lang.org/downloads.html
ここからsourceをクリックしてダウンロードします。
ダウンロードしたら解凍した後に適当な場所へ移動します。

```bash
$ mkdir -p /usr/local/src
$ mv ~/Downloads/rustc-1.9 /usr/local/src
```

## Editor

個人的な好みでVisual Studio Code(以下VSC)を使います。
Golang,PythonもVSCで書いてますが拡張が使いやすいのでオススメです。
他のEditor使いたい場合は調べてください・・・！

* `ext install`で拡張[Rusty Code](https://marketplace.visualstudio.com/items?itemName=saviorisdead.RustyCode)のinstall
* [racer](https://github.com/phildawes/racer)のinstall

```bash
$ cargo install racer
(3~5分かかります...)
```

`RUST_SRC_PATH`に先ほどダウンロードしたソースコードのPATHを指定します。

```bash:~/.bash_profile
export RUST_SRC_PATH=/usr/local/src/rustc-1.9/src
```

動作確認します。

```bash
$ racer complete std::io::B
MATCH BufReader,48,11,/usr/local/src/rustc-1.9.0/src/libstd/io/buffered.rs,Struct,pub struct BufReader<R>
MATCH BufWriter,300,11,/usr/local/src/rustc-1.9.0/src/libstd/io/buffered.rs,Struct,pub struct BufWriter<W: Write>
MATCH BufRead,1200,10,/usr/local/src/rustc-1.9.0/src/libstd/io/mod.rs,Trait,pub trait BufRead: Read
MATCH Bytes,1528,11,/usr/local/src/rustc-1.9.0/src/libstd/io/mod.rs,Struct,pub struct Bytes<R>
```

* [rustfmt](https://github.com/rust-lang-nursery/rustfmt)のinstall

```bash
$ cargo install rustfmt
(3~5分かかります...)
```

動作確認用にコード用意します。

```bash
$ cd /path/to/develop/rust
$ cargo new hello_world --bin
$ cd hello_world;code ./
(codeでVSC開く設定をしていない場合は普通に開いてください)
```

`hello_world/src`に以下のコードが生成されているはずです。

```rust:main.rs
fn main() {
    println!("Hello, World!");
}
```

動作確認します。

```bash
$ cargo fmt
(何も出力されなければOK)
```

editorを開いたまま`⌘ + ,`で`setting.jsonを編集します。

```json:setting.json
{
  //-------- Rust configuration
  "rust.racerPath": "$HOME/.cargo/bin/racer",
  "rust.rustLangSrcPath": "/usr/local/src/rustc-1.9.0/src",
  "rust.rustfmtPath": "$HOME/.cargo/bin/rustfmt",
  "rust.cargoPath": "/usr/local/bin/cargo",
  "rust.cargoHomePath": null, // Path to Cargo home directory, mostly needed for racer. Needed only if using custom rust installation.
  "rust.formatOnSave": false, // Turn on/off autoformatting file on save (EXPERIMENTAL)
  "rust.checkOnSave": false, // Turn on/off `cargo check` project on save (EXPERIMENTAL)
  "rust.checkWith": "build" // Specifies the linter to use. (EXPERIMENTAL)
}
```

ここまでで標準crateのautocompleteが聞くようになると思います。
コードに依存しているcrateも`user hogehoge::HOGE`まで書けばautocomplete聞いているように感じます。

## 他のcrateを使用する場合

cargoというpackage managerを使用していきます。
`cargo new`をした場合、`Cargo.toml`が生成されるのでこれを編集します。

```Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
authors = [""]

// 追加
[dependencies]
time = "0.1.35"
regex = "0.1.71"
```

`cargo build`して依存しているcrateをダウンロードします。
割と時間かかるのがネックですねー・・・

パッケージを使用して先ほどのコードを修正します。

```rust:main.rs
extern crate regex;
extern crate time;

use regex::Regex;

fn main() {
    let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
    println!("Did you date match? {}", re.is_match("2016-05-28"));
    let now = time::now();
    println!("It is {} now.", now.rfc3339());
}
```

実行してみます。

```bash
$ cargo run
   Compiling hello_world v0.1.0
     Running `target/debug/hello_world`
Did you date match? true
It is 2016-05-28T22:45:16+09:00 now.
```

良さそうです。

## まとめ

昔よりドキュメントなども整備されているので、始め時かなと思いました。