LoginSignup
1
1

Rubyのクラスとインスタンス(初期化、変数、メソッドについて)

Last updated at Posted at 2021-09-06

クラスとインスタンスとは

クラスとは設計書みたいなものです。
インスタンスとは設計書を下に作られたものです。

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.インスタンスメソッド
インスタンスメソッドは、ある「個別のもの」に対して行う動作や処理のことです。
例えば、ある人(オブジェクト)に関する情報を取得するときに使います。
一冊の本(オブジェクト)を手に取り、その本のページをめくる行為がインスタンスメソッドに相当します。
それは一つの具体的な本に対する操作です。

book.rb
class Book
  def page_count
    # 本のページ数を返す
  end
end

book = Book.new
pages = book.page_count

2.クラスメソッド

クラスメソッドは、ある「種類全体」に関する処理や操作をします。
具体的なインスタンスに紐づかない動作です。
例えば、ある種類のものを一括で検索するときに使います。
例えば、図書館全体の本(クラス)を対象に、特定のジャンルの本を探す行為がクラスメソッドに相当します。
それは特定の本ではなく、全体に関する操作です。

book.rb
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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1