Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JA] Rust translation chap4 done #254

Merged
merged 1 commit into from
Jul 20, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 142 additions & 0 deletions lessons/ja/chapter_4.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
- title: 第 4 章 - ジェネリック型
content_markdown: |
ジェネリック型は Rust において非常に重要です。
これらの型は null 許容な値(つまりまだ値を持たない変数)の表現、エラー処理、コレクションなどに使用されます。
このセクションでは、あなたがいつも使用するであろう基本的なジェネリック型について学習します。
- title: ジェネリック型とは?
content_markdown: |
ジェネリック型は `struct` や `enum` を部分的に定義することを可能にします。
コンパイル時にコードでの使用状況に基づいて完全に定義されたバージョンが生成されます。

Rust は通常、インスタンスを生成するコードから最終的な型を推論できます。
しかし補助が必要な場合は、`::<T>` 演算子を使って明示的に指定できます。
この演算子は `turbofish` という名前でも知られています(彼とは仲良しです!)。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%2F%2F%20%E9%83%A8%E5%88%86%E7%9A%84%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%9F%E6%A7%8B%E9%80%A0%E4%BD%93%E5%9E%8B%0Astruct%20BagOfHolding%3CT%3E%20%7B%0A%20%20%20%20item%3A%20T%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20%E6%B3%A8%E6%84%8F%3A%20%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%83%83%E3%82%AF%E5%9E%8B%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E5%9E%8B%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%2F%2F%20%3A%3A%3C%3E%20(turbofish)%20%E3%81%A7%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E5%9E%8B%E3%82%92%E6%8C%87%E5%AE%9A%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%2042%20%7D%3B%0A%20%20%20%20let%20bool_bag%20%3D%20BagOfHolding%3A%3A%3Cbool%3E%20%7B%20item%3A%20true%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%83%83%E3%82%AF%E5%9E%8B%E3%81%A7%E3%82%82%E5%9E%8B%E6%8E%A8%E8%AB%96%E5%8F%AF%E8%83%BD%0A%20%20%20%20let%20float_bag%20%3D%20BagOfHolding%20%7B%20item%3A%203.14%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20%E6%B3%A8%E6%84%8F%3A%20%E5%AE%9F%E7%94%9F%E6%B4%BB%E3%81%A7%E3%81%AF%E6%89%8B%E6%8F%90%E3%81%92%E8%A2%8B%E3%82%92%E6%89%8B%E6%8F%90%E3%81%92%E8%A2%8B%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%0A%20%20%20%20let%20bag_in_bag%20%3D%20BagOfHolding%20%7B%0A%20%20%20%20%20%20%20%20item%3A%20BagOfHolding%20%7B%20item%3A%20%22boom!%22%20%7D%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%22%2C%0A%20%20%20%20%20%20%20%20i32_bag.item%2C%20bool_bag.item%2C%20float_bag.item%2C%20bag_in_bag.item.item%0A%20%20%20%20)%3B%0A%7D%0A
- title: 値がないことの表現
content_markdown: |
他の言語では、値が存在しないことを表すためにキーワード `null` が用いられます。
これは変数やフィールドの操作に失敗する可能性があることを意味するため、プログラミング言語に困難をもたらします。

Rust には `null` はありませんが、値がないことを表現することの重要性を無視しているわけではありません。
既に知っているツールを使った素朴な表現を考えてみましょう。

1つ以上の値を `None` によって代替するパターンは、`null` がない Rust ではとても一般的です。
ジェネリック型はこの問題を解決するのに役立ちます。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=enum%20Item%20%7B%0A%20%20%20%20Inventory(String)%2C%0A%20%20%20%20%2F%2F%20None%20%E3%81%AF%E9%A0%85%E7%9B%AE%E3%81%8C%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%99%0A%20%20%20%20None%2C%0A%7D%0A%0Astruct%20BagOfHolding%20%7B%0A%20%20%20%20item%3A%20Item%2C%0A%7D%0A
- title: Option
content_markdown: |
Rustには `Option` と呼ばれるジェネリックな列挙型が組み込まれており、`null` を使わずに null 許容な値を表現できます。

```
enum Option<T> {
None,
Some(T),
}
```

この列挙型はとても一般的なもので、`Some` と `None` を使えばどこでもインスタンスを生成できます。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%2F%2F%20%E9%83%A8%E5%88%86%E7%9A%84%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%9F%E6%A7%8B%E9%80%A0%E4%BD%93%E5%9E%8B%0Astruct%20BagOfHolding%3CT%3E%20%7B%0A%20%20%20%20%2F%2F%20%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%20T%20%E3%82%92%E6%B8%A1%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E5%8F%AF%E8%83%BD%0A%20%20%20%20item%3A%20Option%3CT%3E%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20%E6%B3%A8%E6%84%8F%3A%20i32%20%E3%81%8C%E5%85%A5%E3%82%8B%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E3%80%81%E4%BD%95%E3%82%82%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%EF%BC%81%0A%20%20%20%20%2F%2F%20None%20%E3%81%8B%E3%82%89%E3%81%AF%E5%9E%8B%E3%81%8C%E6%B1%BA%E3%82%81%E3%82%89%E3%82%8C%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E5%9E%8B%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%20None%20%7D%3B%0A%0A%20%20%20%20if%20i32_bag.item.is_none()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E3%81%AF%E4%BD%95%E3%82%82%E3%81%AA%E3%81%84%EF%BC%81%22)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E3%81%AF%E4%BD%95%E3%81%8B%E3%81%82%E3%82%8B%EF%BC%81%22)%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%20Some(42)%20%7D%3B%0A%0A%20%20%20%20if%20i32_bag.item.is_some()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E3%81%AF%E4%BD%95%E3%81%8B%E3%81%82%E3%82%8B%EF%BC%81%22)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E3%81%AF%E4%BD%95%E3%82%82%E3%81%AA%E3%81%84%EF%BC%81%22)%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20match%20%E3%81%AF%20Option%20%E3%82%92%E3%82%A8%E3%83%AC%E3%82%AC%E3%83%B3%E3%83%88%E3%81%AB%E5%88%86%E8%A7%A3%E3%81%97%E3%81%A6%E3%80%81%0A%20%20%20%20%2F%2F%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%8C%E5%87%A6%E7%90%86%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%EF%BC%81%0A%20%20%20%20match%20i32_bag.item%20%7B%0A%20%20%20%20%20%20%20%20Some(v)%20%3D%3E%20println!(%22%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%20%7B%7D%20%E3%82%92%E7%99%BA%E8%A6%8B%EF%BC%81%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20None%20%3D%3E%20println!(%22%E4%BD%95%E3%82%82%E8%A6%8B%E4%BB%98%E3%81%8B%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%22)%2C%0A%20%20%20%20%7D%0A%7D%0A
- title: Result
content_markdown: |
Rustには `Result` と呼ばれるジェネリックな列挙型が組み込まれており、失敗する可能性のある値を返せます。
これは言語がエラーを処理する際の慣用的な方法です。

```
enum Result<T, E> {
Ok(T),
Err(E),
}
```

このジェネリック型はカンマで区切られた複数の*パラメータ化された型*を持つことに注意してください。

この列挙型はとても一般的なもので、`Ok` と `Err` を使えばどこでもインスタンスを生成できます。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3Ai32)%20-%3E%20Result%3Cf32%2CString%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22%E6%AD%A3%E3%81%97%E3%81%84%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%22))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20result%20%3D%20do_something_that_might_fail(12)%3B%0A%0A%20%20%20%20%2F%2F%20match%20%E3%81%AF%20Result%20%E3%82%92%E3%82%A8%E3%83%AC%E3%82%AC%E3%83%B3%E3%83%88%E3%81%AB%E5%88%86%E8%A7%A3%E3%81%97%E3%81%A6%E3%80%81%0A%20%20%20%20%2F%2F%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%8C%E5%87%A6%E7%90%86%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%EF%BC%81%0A%20%20%20%20match%20result%20%7B%0A%20%20%20%20%20%20%20%20Ok(v)%20%3D%3E%20println!(%22%E7%99%BA%E8%A6%8B%20%7B%7D%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20Err(e)%20%3D%3E%20println!(%22Error%3A%20%7B%7D%22%2Ce)%2C%0A%20%20%20%20%7D%0A%7D%0A
- title: 失敗するかもしれない main
content_markdown: |
`main` は `Result` を返すことができます。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22%E6%AD%A3%E3%81%97%E3%81%84%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%22))%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20main%20%E3%81%AF%E5%80%A4%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8C%E3%80%81%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%BF%94%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%EF%BC%81%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20let%20result%20%3D%20do_something_that_might_fail(12)%3B%0A%0A%20%20%20%20match%20result%20%7B%0A%20%20%20%20%20%20%20%20Ok(v)%20%3D%3E%20println!(%22%E7%99%BA%E8%A6%8B%20%7B%7D%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20Err(_e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E3%81%86%E3%81%BE%E3%81%8F%E5%87%A6%E7%90%86%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%9F%E3%81%AE%E3%81%8B%E3%82%92%E8%AA%AC%E6%98%8E%E3%81%99%E3%82%8B%E6%96%B0%E3%81%97%E3%81%84%20Err%20%E3%82%92%20main%20%E3%81%8B%E3%82%89%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%EF%BC%81%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Err(String%3A%3Afrom(%22main%20%E3%81%A7%E4%BD%95%E3%81%8B%E5%95%8F%E9%A1%8C%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81%22))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Result%20%E3%81%AE%20Ok%20%E3%81%AE%E4%B8%AD%E3%81%AB%E3%81%82%E3%82%8B%20unit%20%E5%80%A4%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81%0A%20%20%20%20%2F%2F%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%8C%E6%AD%A3%E5%B8%B8%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E7%8F%BE%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%0A%20%20%20%20Ok(())%0A%7D%0A
- title: 簡潔なエラー処理
content_markdown: |
`Result` はとてもよく使うので、Rust にはそれを扱うための強力な演算子 `?` が用意されています。
以下の2つのコードは等価です。

```
do_something_that_might_fail()?
```

```
match do_something_that_might_fail() {
Ok(v) => v,
Err(e) => return Err(e),
}
```
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22%E6%AD%A3%E3%81%97%E3%81%84%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%22))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20%2F%2F%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E7%B0%A1%E6%BD%94%E3%81%AA%E3%81%AE%E3%81%AB%E6%B3%A8%E7%9B%AE%EF%BC%81%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(42)%3F%3B%0A%20%20%20%20println!(%22%E7%99%BA%E8%A6%8B%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20Ok(())%0A%7D%0A
- title: やっつけな Option/Result 処理
content_markdown: |
`Option`/`Result` を使って作業するのは、ちょっとしたコードを書くのには厄介です。
`Option` と `Result` の両方には `unwrap` と呼ばれる関数があり、手っ取り早く値を取得するのには便利です。
`unwrap` は以下のことを行います。

1. `Option`/`Result` 内の値を取得します。
2. 列挙型が `None`/`Err` の場合、`panic!` します。

以下の2つのコードは等価です。

```
my_option.unwrap()
```

```
match my_option {
Some(v) => v,
None => panic!("Rust によって生成されたエラーメッセージ!"),
}
```

同様に:

```
my_result.unwrap()
```

```
match my_result {
Ok(v) => v,
Err(e) => panic!("Rust によって生成されたエラーメッセージ!"),
}
```

良い Rust 使い(Rustacean)であるためには、可能な限り適切に `match` を使用してください。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22%E6%AD%A3%E3%81%97%E3%81%84%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%22))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20%2F%2F%20%E7%B0%A1%E6%BD%94%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E5%80%A4%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BB%AE%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%0A%20%20%20%20%2F%2F%20%E3%81%99%E3%81%90%E3%81%AB%E3%83%80%E3%83%A1%E3%81%AB%E3%81%AA%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(42).unwrap()%3B%0A%20%20%20%20println!(%22%E7%99%BA%E8%A6%8B%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20%E3%83%91%E3%83%8B%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%EF%BC%81%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(1).unwrap()%3B%0A%20%20%20%20println!(%22%E7%99%BA%E8%A6%8B%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20%0A%20%20%20%20Ok(())%0A%7D%0A
- title: ベクタ型
content_markdown: |
最も有用なジェネリック型のいくつかはコレクション型です。
ベクタは構造体 `Vec` で表される可変サイズのリストです。

マクロ `vec!` を使えば、手動で構築するよりも簡単にベクタを生成できます。

`Vec` にはメソッド `iter()` があります。
これによってベクタからイテレータを生成すれば、ベクタを簡単に `for` ループに入れることができます。

メモリに関する詳細:

* `Vec` は構造体ですが、内部的にはヒープ上の固定リストへの参照を含んでいます。
* ベクタはデフォルトの容量で始まります。
容量よりも多くの項目が追加された場合、ヒープ上により大きな容量の固定リストを生成して、データを再割り当てします。
code: >-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20%2F%2F%20%E5%9E%8B%E3%82%92%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E6%8C%87%E5%AE%9A%0A%20%20%20%20let%20mut%20i32_vec%20%3D%20Vec%3A%3A%3Ci32%3E%3A%3Anew()%3B%20%2F%2F%20turbofish%20%3C3%0A%20%20%20%20i32_vec.push(1)%3B%0A%20%20%20%20i32_vec.push(2)%3B%0A%20%20%20%20i32_vec.push(3)%3B%0A%0A%20%20%20%20%2F%2F%20%E3%82%82%E3%81%A3%E3%81%A8%E8%B3%A2%E3%81%8F%E3%80%81%E5%9E%8B%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E6%8E%A8%E8%AB%96%0A%20%20%20%20let%20mut%20float_vec%20%3D%20Vec%3A%3Anew()%3B%0A%20%20%20%20float_vec.push(1.3)%3B%0A%20%20%20%20float_vec.push(2.3)%3B%0A%20%20%20%20float_vec.push(3.4)%3B%0A%0A%20%20%20%20%2F%2F%20%E3%81%8D%E3%82%8C%E3%81%84%E3%81%AA%E3%83%9E%E3%82%AF%E3%83%AD%EF%BC%81%0A%20%20%20%20let%20string_vec%20%3D%20vec!%5BString%3A%3Afrom(%22Hello%22)%2C%20String%3A%3Afrom(%22World%22)%5D%3B%0A%0A%20%20%20%20for%20word%20in%20string_vec.iter()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20word)%3B%0A%20%20%20%20%7D%0A%7D%0A
- title: 第 4 章 - まとめ
content_markdown: |
この章でジェネリック型がどれだけの力を発揮するのかがわかりました。
すべて使いこなせなくても心配しないでください。
今は、コードの中で何度も目にするであろう主要なアイデアを意識するだけで良いと思います。
私たちの関数はかなり長くなっています。
次の章では、Rust の重要な概念であるデータの所有権について説明します。