今年の言語はRust その４１

# 今年の言語はRust その４１

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 14 CargoとCrates.ioについてより詳しく

__Cargo__ の様々な機能を紹介

その他詳細はドキュメントを参照されたし

[Introduction - The Cargo Book](https://doc.rust-lang.org/cargo/)

### 14.2 Crates.ioにクレートを公開する

ここからは__crates.io__に関する説明です。

パッケージをホストします


#### 役立つドキュメンテーションコメントを行う

なんとRustはドキュメントの生成機能がある！！！

なんてことだ

ドキュメントコードは__///__ スラッシュ三つだ


```rust
/// Adds one to the number given.
///
/// # Ecamples
///
/// ```
/// let five = 5;
///
/// assert_eq!(6, my_crate::add_one(5));
/// ```
pub fn add_one(x: i32) -> i32 {
    x + 1
}

```

以下のコマンドでドキュメントを作成できる

```rust
$ cargo doc
$ cargo doc --open
```

__加えて__ ,__ドキュメントテスト__ もできる。

```rust
$ cargo test
```



#### 含まれている要素にコメントする

```rust
//! # My Crate
//!
//! 'my_cate' is a collection of utilities to make performing certain
//! calculations more convenient.
```

#### よく使われるセクション

```rust
/// Adds one to the number given.
///
/// # Ecamples
///
/// ```
/// let five = 5;
///
/// assert_eq!(6, my_crate::add_one(five));
/// ```
///
/// # Panics
/// panic perterns
///
/// # Errors
/// Error Parturns.
///
/// # Safety
/// Safety Parturns.
///
pub fn add_one(x: i32) -> i32 {
    x + 1
}

```

#### 'pub use' で公開APIをエクスポート

pub useでサブモジュール内のオブジェクトを指定しておけば、利用する側ではショートカットして使える

lib.rs
```rust
//! # FiArt
//!
//! A library for modeling artistic concepts

pub use kinds::PrimaryColor;
pub use kinds::SecondaryColor;
pub use utils::mix;

pub mod kinds {
    /// The primary colors according to the RYB color model.
    pub enum PrimaryColor {
        Red,
        Yellow,
        Blue,
    }
    
    /// The secondary colors according to the RYB color model.
    pub enum SecondaryColor{
        Orange,
        Green,
        Purple,
    }
}


pub mod utils {
    use crate::kinds::*;
    
    /// Combindes two primary colors
    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor{
        // -- snip
        SecondaryColor::Orange
    }
}


```

main.rs
```rust
extern crate fiart;

use fiart::PrimaryColor;
use fiart::mix;

fn main() {

}
```


#### Crates.ioに公開

なんとパッケージ管理へのデプロイが標準装備されている 涙

なんてことだ

```rust
$ cargo publish
```

ただ事前に, .tomlファイルにて以下の項目を追加しておく

- name
- version
- description
- license

Cargo.toml

```bash
[package]
name = "guessing_game"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
description = "A fun game where you guess what number the computer has chosen."
              (コンピュータが選択した数字を言い当てる面白いゲーム)
license = "MIT OR Apache-2.0"

[dependencies]

```

ヴァージョン付けに関しては[セマンティック バージョニング 2.0.0 | Semantic Versioning](https://semver.org/lang/ja/)を参考にすること

これまでヴァージョン付けの方法が分からなかったのでとても参考になった。

独学でやってるとこういうノウハウに近い部分の情報が少なくてつらい。


### 14.3 Cargoのワークスペース

> ワークスペースは、同じCargo.lockと出力ディレクトリを共有する一連のパッケージです。

??

例として__バイナリ1つとライブラリ2つを含むワークスペースを作ります__

まず、addディレクトリを作成して、Cargo.tomlを作ります

```bash
[workspace]

members = [
    "adder",
]
```

そして、addディレクトリ内でバイナリクレートを作ります
```bash
$ cargo new --bin adder
```

すると以下のような構成になります


```bash
$ tree add
add
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── Cargo.lock
├── Cargo.toml
└── target
```

#### ワークスペース内に2番目のクレートを作成する

```bash
$ cargo new add-one --lib
```

```bash
$ tree .
.
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── add-one
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── Cargo.lock
├── Cargo.toml
└── target
```

ワークスペース内の各クレートがお互いに依存しているとは想定していないので、、
クレート間の依存関係について明示します

Cargo.toml
```bash
[dependencies]
add-one = { path = "../add-one" }
```

```rust
extern crate add_one;

fn main() {
    
    use add_one::add_one;

    let num = 10;
    println!("Hello, world!. {}+1={}", num, add_one(num));
}

```


#### ワークスペースの外部クレートに依存する

cargo.ioに登録されている__rand__を使う例です

Cargo.toml
```bash
[dependencies]
rand = "0.3.14"
```

### 14.4 cargo installでCrates.ioからバイナリをインストールする

```bash 
$ cargo install ripgrep

Updating registry `https://github.com/rust-lang/crates.io-index`
 Downloading ripgrep v0.3.2
 --snip--
   Compiling ripgrep v0.3.2
    Finished release [optimized + debuginfo] target(s) in 97.91 secs
  Installing ~/.cargo/bin/rg
```

> rg --helpを走らせて、 より高速でRustらしいファイル検索ツールを使用し始めることができます！

#### 独自コマンドでCargoを拡張する

cargoは拡張コマンドをバイナリ名で解決します

'cargo-something'という名前なら'cargo something'を実行することでサブコマンドのようにふるまえます


イエス！