クラスとインスタンスとは
クラスとは設計書みたいなものです。
インスタンスとは設計書を下に作られたものです。
ex)
具体的に説明すると
クラスを野球のグローブだとします。
インスタンスが赤いグローブ、黒いグローブ、黄色いグローブ
とします。
これはグローブという設計図(クラス)から
いろいろな色のグローブ(インスタンス)を作るということです。
クラスについて
今回は野球のグローブをクラスとして扱っていきます。
class Glove
end
#Gloveクラスのインスタンス作成
Glove.new
ちなみに***クラス名の最初の文字は大文字(CamelCase)***です。
メソッドを入れると
class Glove #クラスを定義
def player
pitcher = "ピッチャー"
puts pitcher
end
end
#Gloveクラスのインスタンス作成
glove = Glove.new
glove.player
で実行すると
ピッチャー
と出力されます。
インスタンス変数とローカル変数
⚫︎インスタンス変数とは@をつけてクラス内のインスタンスで使いまわせる変数です。
⚫︎ローカル変数とは何もつけず、使用範囲が狭い変数です。
まずインスタンス変数を使います。
class Glove #クラスを定義
def player(pitcher)
@pitcher = pitcher #インスタンス変数@pitcherを宣言
puts @pitcher
end
def pitcher
@pitcher #違うインスタンスメソッドで呼び出す。
end
end
#Gloveクラスのインスタンス作成
glove1 = Glove.new
glove2 = Glove.new
#この2つは別々のもの
glove1.player("ピッチャー")
glove2.player("投手")
#@pitcherのインスタンス変数で使い回せている
puts glove1.pitcher
puts glove2.pitcher
で実行すると
ピッチャー
投手
と出力
次にローカル変数を使います。
class Glove #クラスを定義
def player(pitcher)
pitcher = pitcher #インスタンス変数@pitcherを宣言
puts pitcher
end
def pitcher
pitcher #違うインスタンスメソッドで呼び出す。
end
end
#Gloveクラスのインスタンス作成
glove1 = Glove.new
glove2 = Glove.new
#この2つは別々のもの
glove1.player("ピッチャー")
glove2.player("投手")
#@pitcherのインスタンス変数で使い回せている
puts glove1.pitcher
puts glove2.pitcher
で実行すると
undefined local variable or method `pitcher ' for #<Glove:0x00007f8826149ac8> (NameError)
Did you mean? pitcher
のようなエラーが出ます。
これはpitcherメソッドのローカル変数pitcherが呼び出されていないというエラーが出ています。
初期処理initialize
Rubyのクラスが新しく作られたときに自動的に呼び出される関数です。
これはクラスが新しく生まれたときに自動的に行われる初期設定のようなものです。
ex)
新しいロボットを作るとき、そのロボットがどんな特別な能力を持つかを設定します。
それと同じように、Rubyのクラスも新しく作られるときに、そのクラスが持つ特別な性質や機能を設定することができます。
initializeメソッドは、クラスが新しく作られるときに自動的に呼び出され、そのクラスの初期設定を行います。これにより、例えばユーザーが新しく登録されたときに、そのユーザーの名前やメールアドレスなどの初期値を設定することができます。
使い方は
class Glove
def initialize()
end
end
コードを書いていくと
class Glove
def initialize(pitcher)
puts "投手"
@pitcher = pitcher
end
def position
puts "私のポジションは#{@pitcher}です。"
end
end
pitcher = Glove.new("ピッチャー")
puts pitcher.position
で実行すると
投手
私のポジションはピッチャーです。
と出力されます。
superとは
initializeでよく使われるメソッドです。
子クラスが親クラスから何かを受け継ぐときに、その親クラスの同じ名前のメソッドを呼び出すために使われます。
ex)
何か料理を作るとき、そのお料理のレシピを師匠から教わるとします。
その時、自分が師匠から教わったレシピを使って料理を作るとき、師匠のレシピを使ったりします。
これと同じように、initializeメソッドの中でsuperを使うと、親クラスのinitializeメソッドが呼び出され、親クラスの初期設定が子クラスにも適用されます。
これにより、子クラスが新しく作られたときに、親クラスと同じ初期設定が行われるようになります。
インスタンスメソッドとクラスメソッド
非エンジニア向けの説明
1.インスタンスメソッド
インスタンスメソッドは、ある「個別のもの」に対して行う動作や処理のことです。
例えば、ある人(オブジェクト)に関する情報を取得するときに使います。
一冊の本(オブジェクト)を手に取り、その本のページをめくる行為がインスタンスメソッドに相当します。
それは一つの具体的な本に対する操作です。
class Book
def page_count
# 本のページ数を返す
end
end
book = Book.new
pages = book.page_count
2.クラスメソッド
クラスメソッドは、ある「種類全体」に関する処理や操作をします。
具体的なインスタンスに紐づかない動作です。
例えば、ある種類のものを一括で検索するときに使います。
例えば、図書館全体の本(クラス)を対象に、特定のジャンルの本を探す行為がクラスメソッドに相当します。
それは特定の本ではなく、全体に関する操作です。
class Book
def self.find_by_genre(genre)
# 特定のジャンルの本を検索して返す
end
end
books = Book.find_by_genre("Mystery")
⚫︎補足
self.
はクラスメソッドで使われます。
要するに、インスタンスメソッドは一つの具体的なものに対する操作(本のページめくり)、クラスメソッドはある種類全体に対する操作(図書館の特定のジャンルの本を検索)といったイメージです。
エンジニア向けの説明
1.インスタンスメソッド
特定のインスタンス(オブジェクト)に対して呼び出されるメソッドです。
通常、インスタンスメソッドはオブジェクトの状態にアクセスするためのものであり、
インスタンス変数にアクセスできます。
例えば、Railsのモデルクラス内で、データベースから取得したレコードに対する処理を行うメソッドは、
インスタンスメソッドとして実装されることがあります。
class Person < ApplicationRecord
def full_name
"#{first_name} #{last_name}"
end
end
person = Person.new(first_name: "John", last_name: "Doe")
puts person.full_name # "John Doe"
2.クラスメソッド
クラスメソッドは、クラス自体に対して呼び出されるメソッドで、
そのクラス全体に関連する処理を行うために使われます。
普通は、インスタンス変数にアクセスすることはありませんが、
Railsでは、クラスメソッドはモデル全体に関連する操作や検索などの処理に使われることがあります。
class Person < ApplicationRecord
def self.by_last_name(last_name)
where(last_name: last_name)
end
end
people = Person.by_last_name("Doe")
上記の例では、by_last_name メソッドはクラスメソッドとして実装され、Personクラス全体に対して特定の姓(last_name)で検索を行います。
インスタンスメソッドは特定のオブジェクトに対する操作に使用され、
クラスメソッドはクラス全体に対する操作に使用されます。
参考資料
ChatGPT