From fc38f97d8901d0cbd314ce4360d1e446e620f73d Mon Sep 17 00:00:00 2001 From: "Tatsuya Kawano (Circle CI)" Date: Wed, 1 Mar 2017 22:05:10 +0800 Subject: [PATCH] Reformat markdown for Generics chapter (1.9) - Reformat HTML comments to follow our style guide. - Insert newline after every Japanese period. --- 1.9/ja/book/generics.md | 117 ++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 47 deletions(-) diff --git a/1.9/ja/book/generics.md b/1.9/ja/book/generics.md index 8a168133..716cff20 100644 --- a/1.9/ja/book/generics.md +++ b/1.9/ja/book/generics.md @@ -1,16 +1,21 @@ % ジェネリクス - -時々、関数やデータ型を書いていると、引数が複数の型に対応したものが欲しくなることもあります。Rustでは、ジェネリクスを用いてこれを実現しています。ジェネリクスは型理論において「パラメトリック多相」(parametric polymorphism)と呼ばれ、与えられたパラメータにより(「parametric」)型もしくは関数が多数の様相(「poly」は多様、「morph」は様相を意味します)(訳注: ここで「様相」は型を指します)を持つことを意味しています。 - - -さて、型理論はもう十分です。続いてジェネリックなコードを幾つか見ていきましょう。Rustが標準ライブラリで提供している型 `Option` はジェネリックです。 + + + + + +時々、関数やデータ型を書いていると、引数が複数の型に対応したものが欲しくなることもあります。 +Rustでは、ジェネリクスを用いてこれを実現しています。 +ジェネリクスは型理論において「パラメトリック多相」(parametric polymorphism)と呼ばれ、与えられたパラメータにより(「parametric」)型もしくは関数が多数の様相(「poly」は多様、「morph」は様相を意味します) +(訳注: ここで「様相」は型を指します)を持つことを意味しています。 + + + +さて、型理論はもう十分です。 +続いてジェネリックなコードを幾つか見ていきましょう。 +Rustが標準ライブラリで提供している型 `Option` はジェネリックです。 ```rust enum Option { @@ -19,22 +24,29 @@ enum Option { } ``` - -`` の部分は、前に少し見たことがあると思いますが、これがジェネリックなデータ型であることを示しています。 `enum` の宣言内であれば、どこでも `T` を使うことができ、宣言内に登場する同じ型をジェネリック内で `T` 型に置き換えています。型注釈を用いた`Option`の使用例が以下になります。 + + + + +`` の部分は、前に少し見たことがあると思いますが、これがジェネリックなデータ型であることを示しています。 +`enum` の宣言内であれば、どこでも `T` を使うことができ、宣言内に登場する同じ型をジェネリック内で `T` 型に置き換えています。 +型注釈を用いた`Option`の使用例が以下になります。 ```rust let x: Option = Some(5); ``` - -この型宣言では `Option` と書かれています。 `Option` の違いに注目して下さい。そう、上記の `Option` では `T` の値は `i32` です。この束縛の右辺の `Some(T)` では、 `T` は `5` となります。それが `i32` なので、両辺の型が一致するため、Rustは満足します。型が不一致であれば、以下のようなエラーが発生します。 + + + + + +この型宣言では `Option` と書かれています。 +`Option` の違いに注目して下さい。 +そう、上記の `Option` では `T` の値は `i32` です。 +この束縛の右辺の `Some(T)` では、 `T` は `5` となります。 +それが `i32` なので、両辺の型が一致するため、Rustは満足します。 +型が不一致であれば、以下のようなエラーが発生します。 ```rust,ignore let x: Option = Some(5); @@ -42,9 +54,10 @@ let x: Option = Some(5); // found `core::option::Option<_>` (expected f64 but found integral variable) ``` - -これは `f64` を保持する `Option` が作れないという意味ではありませんからね!リテラルと宣言の型をぴったり合わせなければなりません。 + + +これは `f64` を保持する `Option` が作れないという意味ではありませんからね! +リテラルと宣言の型をぴったり合わせなければなりません。 ```rust let x: Option = Some(5); @@ -52,10 +65,12 @@ let y: Option = Some(5.0f64); ``` -これだけで結構です。1つの定義で、多くの用途が得られます。 +これだけで結構です。 +1つの定義で、多くの用途が得られます。 -ジェネリクスにおいてジェネリックな型は1つまで、といった制限はありません。Rustの標準ライブラリに入っている類似の型 `Result` について考えてみます。 +ジェネリクスにおいてジェネリックな型は1つまで、といった制限はありません。 +Rustの標準ライブラリに入っている類似の型 `Result` について考えてみます。 ```rust enum Result { @@ -64,9 +79,11 @@ enum Result { } ``` - -この型では `T` と `E` の _2つ_ がジェネリックです。ちなみに、大文字の部分はあなたの好きな文字で構いません。もしあなたが望むなら `Result` を、 + + +この型では `T` と `E` の _2つ_ がジェネリックです。 +ちなみに、大文字の部分はあなたの好きな文字で構いません。 +もしあなたが望むなら `Result` を、 ```rust enum Result { @@ -75,12 +92,13 @@ enum Result { } ``` - -のように定義できます。慣習としては、「Type」から第1ジェネリックパラメータは `T` であるべきですし、「Error」から `E` を用いるのですが、Rustは気にしません。 + + +のように定義できます。 +慣習としては、「Type」から第1ジェネリックパラメータは `T` であるべきですし、「Error」から `E` を用いるのですが、Rustは気にしません。 - + + `Result` 型は計算の結果を返すために使われることが想定されており、正常に動作しなかった場合にエラーの値を返す機能を持っています。 @@ -96,9 +114,10 @@ fn takes_anything(x: T) { } ``` - -構文は2つのパーツから成ります。 `` は「この関数は1つの型、 `T` に対してジェネリックである」ということであり、 `x: T` は「xは `T` 型である」という意味です。 + + +構文は2つのパーツから成ります。 +`` は「この関数は1つの型、 `T` に対してジェネリックである」ということであり、 `x: T` は「xは `T` 型である」という意味です。 複数の引数が同じジェネリックな型を持つこともできます。 @@ -134,12 +153,12 @@ let int_origin = Point { x: 0, y: 0 }; let float_origin = Point { x: 0.0, y: 0.0 }; ``` - + + 関数と同様に、 `` がジェネリックパラメータを宣言する場所であり、型宣言において `x: T` を使うのも同じです。 - + + ジェネリックな `struct` に実装を追加したい場合、 `impl` の後に型パラメータを宣言するだけです。 ```rust @@ -155,12 +174,16 @@ impl Point { } ``` - -ここまででありとあらゆる型をとることのできるジェネリクスについて見てきました。多くの場合これらは有用です。 `Option` は既に見た通りですし、のちに `Vec` のような普遍的なコンテナ型を知ることになるでしょう。一方で、その柔軟性と引き換えに表現力を増加させたくなることもあります。それは何故か、そしてその方法を知るためには [トレイト境界][traits] を読んで下さい。 + + + + + +ここまででありとあらゆる型をとることのできるジェネリクスについて見てきました。 +多くの場合これらは有用です。 +`Option` は既に見た通りですし、のちに `Vec` のような普遍的なコンテナ型を知ることになるでしょう。 +一方で、その柔軟性と引き換えに表現力を増加させたくなることもあります。 +それは何故か、そしてその方法を知るためには [トレイト境界][traits] を読んで下さい。 [traits]: traits.html [Vec]: ../std/vec/struct.Vec.html