はじめに
レシーバは一般的に利用される関数と違い形式がわかりづらいです。
本記事を読んでいただき、レシーバの理解に役立てていただければ幸いです。
レシーバとは
レシーバは特定の型に対するメソッドを定義する際に使用されます。
メソッドが操作する主体を指し、メソッドがどの型に属するかを定義します。
レシーバの書き方
package main
import "fmt"
// 1. 型の定義:
// type ~ structは、Rectangle構造体を定義しています。Rectangleは長方形を表します。
type Rectangle struct {
Width, Height int
}
// 2. レシーバを持つメソッドの定義:
// Rectangle構造体に対するAreaメソッドを定義しています。これは長方形の面積を計算します。
func (r Rectangle) Area() int {
return r.Width * r.Height
}
func main() {
// 3. Rectangle構造体のインスタンスを作成
rect := Rectangle{Width: 10, Height: 5}
// 4. メソッドの呼び出し
fmt.Println("長方形の面積:", rect.Area())
}
実行結果
$ go run main.go
長方形の面積: 50
コードの説明
-
型の定義:
type Rectangle struct { Width, Height int }でRectangleという新しい型を定義しています。Rectangleは長方形を表し、Width(幅)とHeight(高さ)という2つのフィールドを持っています。 -
レシーバを持つメソッドの定義:
func (r Rectangle) Area() int { ... }はRectangle型のメソッドです。ここで(r Rectangle)の部分がレシーバです。Rectangle型のオブジェクトに対して呼び出すことができ、そのオブジェクトのWidthとHeightを使用して面積を計算します。 -
Rectangle構造体のインスタンスを作成:
main関数内でRectangle型のインスタンスrectを作成しています。rectのWidthとHeightはそれぞれ10と5に設定されています。 -
メソッドの呼び出し:
main関数内でRectangle型のインスタンスrectを作成し、rect.Area()を呼び出しています。これにより、Areaメソッドがrectに対して実行され、rectの幅と高さを使用して面積が計算されます。
レシーバの機能
- レシーバr Rectangleは、AreaメソッドがRectangle型に属することを示しています。このメソッドはRectangle型のインスタンスに対してのみ呼び出すことができます。
- メソッド内でrはそのインスタンス自体を参照し、r.Widthやr.Heightのようにしてインスタンスのフィールドにアクセスします。
Rubyの場合
Rubyでは、レシーバではなく、クラス(class
)やインスタンス変数(@width
,@height
)を使って同じことを実現します。
class Rectangle
attr_accessor :width, :height
def initialize(width, height)
@width = width
@height = height
end
def area
@width * @height
end
end
r = Rectangle.new(10, 5)
puts "長方形の面積: #{r.area}"
GoとRubyの違い
- Go:
- 「構造体」というものを使って、データを保持します。そして、その構造体に関連する関数を定義します。
- Go言語では、クラスベースの言語に見られる複雑さを回避し、よりシンプルで明示的なコード構造を提供します。
- Ruby:
- 「クラス」というものを使って、データと関数を一緒に定義します。クラスから作られた「オブジェクト」は、そのデータと関数を持っています。
- Rubyのようなオブジェクト指向言語では、クラスを通じてオブジェクト指向の特徴が表現されます。