[ja] fix typos, translate a Chinese sentence, modify expression
[ja] fixed typos, translate a sentence left in Chinese, modify some expressions.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
前の2つの章で関数とstructをご紹介しました。関数をstructのフィールドとして処理したくなったんじゃないですか?今日は関数のもう一つの形態についてご説明します。受け取り手のいる関数で、我々が`method`とよんでいるものです。
|
||||
|
||||
## method
|
||||
今、このような状況にいると仮定します。あなたは長方形というstructを定義してこの面積を求めようとしています。では、我々の一般的な思考回路に基づけば下のような方法で実現するでしょう。
|
||||
今、このような状況にいると仮定します。あなたは長方形というstructを定義してこの面積を求めようとしています。我々の一般的な思考回路に基づけば下のような方法で実現するでしょう。
|
||||
|
||||
package main
|
||||
import "fmt"
|
||||
@@ -22,11 +22,11 @@
|
||||
fmt.Println("Area of r2 is: ", area(r2))
|
||||
}
|
||||
|
||||
このコードは長方形の面積を求めることができますが、area()はRectangleのメソッドで実現されたものではありません(オブジェクト指向のメソッドのようなもの)。Rectangleのオブジェクト(ここではr1,r2)を引数に面積を京s何する関数に渡しているだけです。
|
||||
このコードは長方形の面積を求めることができますが、area()はRectangleの(一般的なオブジェクト指向でいうような)メソッドで実現されたものではありません。Rectangleのオブジェクト(ここではr1,r2)を引数に面積を計算する関数に渡しているだけです。
|
||||
|
||||
このように実現してももちろん構わないのですが、図形が増えてきて、正方形、五角形ついには多角形になってきた頃、これらの面積も求めようとするとどうでしょう?この場合関数を増やすしかなくなってしまいます。関数名はそれぞれ用意しなければなりません。`area_rectangle, area_circle, area_triangle...`といった具合に。
|
||||
|
||||
下の図で示すように、楕円が関数を表しています。これらの関数はstructに属していない(またはオブジェクト指向の専門用語でclassに属していないといいます)ので、structの外側に単独で存在しており、概念上どのstructにも属していないことになります。
|
||||
下の図で示すように、楕円が関数を表しています。これらの関数はstructに属していない(オブジェクト指向用語で言い換えるとclassに属していない)ので、structの外側に単独で存在しており、概念上どのstructにも属していないことになります。
|
||||
|
||||

|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
明らかにこのような実現方法はエレガントではありません。それに概念からしても"面積"は"形状"の一属性です。これはある特定の形状に属しています。長方形の縦と横と同じようなものです。
|
||||
|
||||
このような理由から`method`の概念が生まれました。`method`はある型の上に付属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`fenc`の後にreceiver(methodがくっついているということです。)を追加します。
|
||||
このような理由から`method`の概念が生まれました。`method`はある型に属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`func`の後にreceiver(methodがくっついているということです)を追加します。
|
||||
|
||||
上で述べた形状の例からすると、method `area()` はある形状(たとえばRectangle)に由来して発生しています。Rectangle.area()の主語はRectangle、area()はRectangleに属するメソッドで外側の関数ではありません。
|
||||
|
||||
@@ -89,9 +89,9 @@ methodの文法は以下のとおりです:
|
||||
|
||||
methodを使う時にはいくつか注意が必要です。
|
||||
|
||||
- methodは名前はまったく同じといってもレシーバが異なればmethodも異なります。
|
||||
- methodはまったく同じ名前でもレシーバが異なればmethodも異なります。
|
||||
- methodはレシーバのフィールドにアクセスすることができます。
|
||||
- methodのコールは`.`を通じてアクセスします。structがフィールドにアクセスするのと同じです。
|
||||
- methodの呼び出しは`.`を通じて行います。structがフィールドにアクセスするのと同じです。
|
||||
|
||||
図解:
|
||||
|
||||
@@ -122,7 +122,7 @@ methodはstructの上でしか使用されないのでしょうか?当然違
|
||||
"December":31,
|
||||
}
|
||||
|
||||
わかりましたか?簡単でしょう?このように自分のコードの中に意味のある型を定義することができるのです。実際はエイリアスを定義しているだけです。Cのtypedefににたようなもので、例えば上のagesはintの代わりになっています。
|
||||
わかりましたか?簡単でしょう?このように自分のコードの中に意味のある型を定義することができるのです。実際はエイリアスを定義しているだけです。Cのtypedefに似たようなもので、例えば上のagesはintの代わりになっています。
|
||||
|
||||
それじゃあ、`method`にもどりましょう。
|
||||
|
||||
@@ -212,17 +212,17 @@ methodはstructの上でしか使用されないのでしょうか?当然違
|
||||
- Volume()はレシーバをBoxとして定義します。Boxの堆積を返します。
|
||||
- SetColor(c Color)はBoxの色をcに変更します。
|
||||
- BiggestsColor()はBoxListに定義されており、listの中の体積が最大の色を返します。
|
||||
- PointItBlack()はBoxListのすべてのBoxの色を全部黒に変更します。
|
||||
- String()はColorに定義されており、Colorno具体的な色を返します(文字列形式)
|
||||
- PaintItBlack()はBoxListのすべてのBoxの色を全部黒に変更します。
|
||||
- String()はColorに定義されており、Colorの具体的な色を返します(文字列形式)
|
||||
|
||||
上のコードは文字で書くと非常に簡単に思えませんか?私達は問題を解決する場合問題の描写を通して、対応するコードを書くことで実現します。
|
||||
|
||||
### ポインタとしてのreceiver
|
||||
ではここで、SetColorのメソッドを見なおしてみましょう。このreceiverはBoxのポインタをさしています。そうです。*Boxを使えるのです。どうしてBox本体ではなくポインタを使うのでしょうか?
|
||||
|
||||
SetColorを定義した本当の目的はこのBoxの色を変更することです。もしBoxのポインタを渡さなければ、SetCororが受け取るのは実はBoxのコピーになってしまいます。つまり、メソッド内で色の変更を行うと、Boxのコピーを操作しているだけで、本当のBoxではないのです。そのため、ポインタを渡す必要があります。
|
||||
SetColorを定義した本当の目的はこのBoxの色を変更することです。もしBoxのポインタを渡さなければ、SetColorが受け取るのは実はBoxのコピーになってしまいます。つまり、メソッド内で色の変更を行うと、Boxのコピーを操作しているだけで、本当のBoxではないのです。そのため、ポインタを渡す必要があります。
|
||||
|
||||
ここではreceiverをメソッドの第一引数にました。こうすれば前の関数で説明した値渡しと参照渡しも難しくなくなるでしょう。
|
||||
ここではreceiverをメソッドの第一引数にしました。こうすれば前の関数で説明した値渡しと参照渡しも難しくなくなるでしょう。
|
||||
|
||||
もしかしたらSetColor関数の中で以下のように定義すべきじゃないかと思われたかもしれません。`*b.Color=c`、ところが`b.Color=c`でよいのです。ポインタに対応する値を読み込むことが必要ですから。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user