メソッド = 関数でしょ?
なんででしょう。なんとなくこういう感覚でした。
もちろん違いますね。オブジェクト指向をきちんと勉強しましょうね(自戒)
とりあえず、一歩前進して以下の解釈になりました。
関数とは
IT用語辞典 -- 関数 【 function 】 ファンクション
関数とは、コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。
うん。こちらの意味は想像と一致してました。
メソッドとは
IT用語辞典 -- メソッド 【 method 】 メンバ関数
オブジェクト指向ではデータと手続きをオブジェクトとして一体化(カプセル化)して定義、利用する。この、オブジェクトに内包された手続き(データに対する処理内容を記述したプログラム)のことをメソッドという。言語によっては「メンバ関数」などということもあるが、ほぼ同じ機能を表す。
オブジェクトに内包された手続き(データに対する処理内容を記述したプログラム)のことをメソッドという。(ここ大事)
Goで見てみる
関数
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
これはとっても理解できました。最初は
メソッド
Go does not have classes. However, you can define methods on types.
クラスはありませんが、types(型)に紐づく関数(メソッド)を定義できるとのこと。
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
}
初見でコレを見たときは、関数定義時のこの点がよく理解できなかった
func (v Vertex) Abs() float64 {
↑↑これは?↑↑
こちらもきちんと説明がありました。
A method is a function with a special receiver argument.
The receiver appears in its own argument list between the func keyword and the method name.
これはreceiver(レシーバー)と言い、どのtypes(型)と紐づいているかを明示しているとのこと。
そのため、main内では、Vertex(types)からメソッドを呼び出すことができていますね!
関数と違い、型と紐づいて初めてメソッドと呼ばれるようになるということだったのか。
前述のメソッドの意味ときちんと一致していますね。
オブジェクトに内包された手続き(データに対する処理内容を記述したプログラム)のことをメソッドという。(ここ大事)
後書き
ようやく関数とメソッドの違いについて疑問に思うことができました。
正直なんとなく使っていた事に気づいて反省。