diff --git a/1.9/ja/book/method-syntax.md b/1.9/ja/book/method-syntax.md index a3a8f06d..173a5190 100644 --- a/1.9/ja/book/method-syntax.md +++ b/1.9/ja/book/method-syntax.md @@ -1,26 +1,29 @@ % メソッド構文 - -関数は素晴らしいのですが、幾つかのデータに対し複数の関数をまとめて呼び出したい時、困ったことになります。以下のコードについて考えてみます。 + + +関数は素晴らしいのですが、幾つかのデータに対し複数の関数をまとめて呼び出したい時、困ったことになります。 +以下のコードについて考えてみます。 ```rust,ignore baz(bar(foo)); ``` - -私たちはこれを左から右へ、「baz bar foo」と読むことになりますが、関数が呼び出される順番は異なり、内側から外へ「foo bar baz」となります。もし代わりにこうできたらいいとは思いませんか? + + + +私たちはこれを左から右へ、「baz bar foo」と読むことになりますが、関数が呼び出される順番は異なり、内側から外へ「foo bar baz」となります。 +もし代わりにこうできたらいいとは思いませんか? ```rust,ignore foo.bar().baz(); ``` - -最初の質問でもう分かっているかもしれませんが、幸いにもこれは可能です!Rustは `impl` キーワードによってこの「メソッド呼び出し構文」の機能を提供しています。 + + +最初の質問でもう分かっているかもしれませんが、幸いにもこれは可能です! +Rustは `impl` キーワードによってこの「メソッド呼び出し構文」の機能を提供しています。 # メソッド呼び出し @@ -50,23 +53,28 @@ fn main() { これは `12.566371` と出力します。 - -私たちは円を表す `struct` を作りました。その際 `impl` ブロックを書き、その中に `area` というメソッドを定義しています。 - - -メソッドに渡す特別な第1引数として、 `self` 、 `&self` 、 `&mut self` という3つの変形があります。第一引数は `foo.bar()` に於ける `foo` だと考えて下さい。3つの変形は `foo` が成り得る3種類の状態に対応しており、それぞれ `self` がスタック上の値である場合、 `&self` が参照である場合、 `&mut self` がミュータブルな参照である場合となっています。 `area` では `&self` を受け取っているため、他の引数と同じように扱えます。引数が `Circle` であるのは分かっていますから、他の `struct` でするように `radius` へアクセスできます。 - - + + +私たちは円を表す `struct` を作りました。 +その際 `impl` ブロックを書き、その中に `area` というメソッドを定義しています。 + + + + + + + + + +メソッドに渡す特別な第1引数として、 `self` 、 `&self` 、 `&mut self` という3つの変形があります。 +第一引数は `foo.bar()` に於ける `foo` だと考えて下さい。 +3つの変形は `foo` が成り得る3種類の状態に対応しており、それぞれ `self` がスタック上の値である場合、 `&self` が参照である場合、 `&mut self` がミュータブルな参照である場合となっています。 +`area` では `&self` を受け取っているため、他の引数と同じように扱えます。 +引数が `Circle` であるのは分かっていますから、他の `struct` でするように `radius` へアクセスできます。 + + + + 所有権を渡すよりも借用を好んで使うべきなのは勿論のこと、ミュータブルな参照よりもイミュータブルな参照を渡すべきですから、 `&self` を常用すべきです。以下が3種類全ての例です。 ```rust @@ -91,9 +99,10 @@ impl Circle { } ``` - -好きな数だけ `impl` ブロックを使用することができます。前述の例は以下のように書くこともできるでしょう。 + + +好きな数だけ `impl` ブロックを使用することができます。 +前述の例は以下のように書くこともできるでしょう。 ```rust struct Circle { @@ -124,10 +133,13 @@ impl Circle { # メソッドチェーン - -ここまでで、`foo.bar()` というようなメソッドの呼び出し方が分かりましたね。ですが元の例の `foo.bar().baz()` はどうなっているのでしょう?これは「メソッドチェーン」と呼ばれています。以下の例を見て下さい。 + + + +ここまでで、`foo.bar()` というようなメソッドの呼び出し方が分かりましたね。 +ですが元の例の `foo.bar().baz()` はどうなっているのでしょう? +これは「メソッドチェーン」と呼ばれています。 +以下の例を見て下さい。 ```rust struct Circle { @@ -165,16 +177,18 @@ fn grow(&self, increment: f64) -> Circle { # Circle } } ``` - -単に `Circle` を返しているだけです。このメソッドにより、私たちは新しい `Circle` を任意の大きさに拡大することができます。 + + +単に `Circle` を返しているだけです。 +このメソッドにより、私たちは新しい `Circle` を任意の大きさに拡大することができます。 # 関連関数 - -あなたは `self` を引数に取らない関連関数を定義することもできます。以下のパターンはRustのコードにおいて非常にありふれた物です。 + + +あなたは `self` を引数に取らない関連関数を定義することもできます。 +以下のパターンはRustのコードにおいて非常にありふれた物です。 ```rust struct Circle { @@ -198,21 +212,25 @@ fn main() { } ``` - -この「関連関数」(associated function)は新たに `Circle` を構築します。この関数は `ref.method()` ではなく、 `Struct::function()` という構文で呼び出されることに注意して下さい。幾つかの言語では、関連関数を「静的メソッド」(static methods)と呼んでいます。 + + + + +この「関連関数」(associated function)は新たに `Circle` を構築します。 +この関数は `ref.method()` ではなく、 `Struct::function()` という構文で呼び出されることに注意して下さい。 +幾つかの言語では、関連関数を「静的メソッド」(static methods)と呼んでいます。 # Builderパターン - -ユーザが `Circle` を作成できるようにしつつも、書き換えたいプロパティだけを設定すれば良いようにしたいとしましょう。もし指定が無ければ `x` と `y` が `0.0` 、 `radius` が `1.0` であるものとします。Rustはメソッドのオーバーロードや名前付き引数、可変個引数といった機能がない代わりにBuilderパターンを採用しており、それは以下のようになります。 + + + + + +ユーザが `Circle` を作成できるようにしつつも、書き換えたいプロパティだけを設定すれば良いようにしたいとしましょう。 +もし指定が無ければ `x` と `y` が `0.0` 、 `radius` が `1.0` であるものとします。 +Rustはメソッドのオーバーロードや名前付き引数、可変個引数といった機能がない代わりにBuilderパターンを採用しており、それは以下のようになります。 ```rust struct Circle { @@ -271,10 +289,16 @@ fn main() { } ``` - -ここではもう1つの `struct` である `CircleBuilder` を作成しています。その中にBuilderメソッドを定義しました。また `Circle` に `area()` メソッドを定義しました。 そして `CircleBuilder` にもう1つ `finalize()` というメソッドを作りました。このメソッドはBuilderから最終的な `Circle` を作成します。さて、先程の要求を実施するために型システムを使いました。 `CircleBuilder` のメソッドを好きなように組み合わせ、作る `Circle` への制約を与えることができます。 + + + + + + +ここではもう1つの `struct` である `CircleBuilder` を作成しています。 +その中にBuilderメソッドを定義しました。 +また `Circle` に `area()` メソッドを定義しました。 +そして `CircleBuilder` にもう1つ `finalize()` というメソッドを作りました。 +このメソッドはBuilderから最終的な `Circle` を作成します。 +さて、先程の要求を実施するために型システムを使いました。 +`CircleBuilder` のメソッドを好きなように組み合わせ、作る `Circle` への制約を与えることができます。