[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:
Hirofumi Tamori
2014-08-29 00:00:55 +09:00
parent 2e1e0749f4
commit 0eecf18075
9 changed files with 20 additions and 20 deletions

View File

@@ -2,7 +2,7 @@
前のつの章で関数と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にも属していないことになります。
![](images/2.5.rect_func_without_receiver.png?raw=true)
@@ -34,7 +34,7 @@
明らかにこのような実現方法はエレガントではありません。それに概念からしても"面積"は"形状"の一属性です。これはある特定の形状に属しています。長方形の縦と横と同じようなものです。
このような理由から`method`の概念が生まれました。`method`はある型の上に付属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`fenc`の後にreceivermethodがくっついているということです)を追加します。
このような理由から`method`の概念が生まれました。`method`はある型属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`func`の後にreceivermethodがくっついているということですを追加します。
上で述べた形状の例からすると、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`でよいのです。ポインタに対応する値を読み込むことが必要ですから。