Ruby

Rubyのゲッターについて

更新日:

こんにちは、Shinyaです

前回セッターについて書いたので、今回はゲッターについて説明していきます

セッターと同じく超基本かつ超重要な部分なので、不安な人は内容を理解しておきましょう!

セッターが分からない人はこちらの記事(Rubyのセッターについて)から読んでくださいね

ゲッターとは

ゲッターとはずばり、インスタンス変数の値を受け取るためのインスタンスメソッドです

曖昧さを無くすために用語の意味を確認しておきましょう

インスタンス変数

  • クラスから作成されるオブジェクト(=インスタンス)ごとに固有の変数
  • 同じクラスから作成されたインスタンス間でも異なる値を持てる
  • クラス内のどのインスタンスメソッドでも使用できる

インスタンスメソッド

  • インスタンスに対してのみ使用可能なメソッド
  • インスタンス変数を扱う処理をする

ゲッターの書き方・使い方

ゲッターを記述するときはクラス内で

def [ゲッター名]
   [インスタンス変数]
end

と書きます

そして使うとき(インスタンス変数の値を受け取るとき)は

[インスタンス].[ゲッター名]

と書きます

ゲッター名は通例としてインスタンス変数と同じにします

[インスタンス].[ゲッター名]の部分がゲッターで受け取る値そのものになります

ゲッター使用例(セッターも使用)

class User

  #セッター
  def name=(name)
    @name = name
  end

  #ゲッター
  def name
    @name
  end

end

#shinyaというインスタンス生成
shinya = User.new

#セッターでshinyaのnameに"Shinya"を代入
shinya.name = "Shinya"

#ゲッターでshinyaのnameを受け取り、putsメソッドで出力
puts shinya.name
#=>プロンプトには"Shinya"が返る

なぜゲッターが要るのか

なぜゲッターが必要なのでしょうか?

結論としてはRubyではインスタンス変数をインスタンスメソッド内でしか扱えないようになっているからです

よって、特定のインスタンスのインスタンス変数の値を受け取るにはインスタンスメソッドを経由するしかないのです

そのインスタンスメソッドがゲッターということになります

(なお、これはセッターが要る理由と全く同じです)

ゲッターの記述を簡略化する方法

インスタンス変数の値を受け取るという非常に基本的なインスタンスメソッドであるゲッターですが、あまりに基本的なので記述を簡略化する方法があります

それは attr_reader です

attr_readerを使うとゲッター記述が以下のように簡略化されます

class User

  #この一行だけでゲッター記述と同じ
  attr_reader :name

  #ゲッターの記述は不要
  #def name
  #  @name
  #end

end

ゲッターを書くのに比べて短く分かりやすいので、ゲッターが必要な時はattr_readerを使うのが一般的です

なお、attr_readerは複数のインスタンス変数に対して一挙に使用可能です

attr_reader :name, :age, :gender, :hobby

セッターとゲッターをまとめる方法【attr_accessor】

ゲッターから話が逸れますが、セッターとゲッターを理解した人だけが使いこなせるメソッドがあります

それは attr_accessor です

このメソッドはattr_writerやattr_readerと同じように使いますが、セッターとゲッター両方の機能を可能にします

class User

  attr_accessor :name

end

#shinyaというインスタンス生成
shinya = User.new

#attr_accessorがあるのでセッター使用可能
shinya.name = "Shinya"

#attr_accessorがあるのでゲッター使用可能
puts shinya.name
#=>プロンプトには"Shinya"が返る

まとめ

以上がゲッターについてでした

インスタンス変数はインスタンスメソッドでしか扱えないという背景をしっかり理解しておきましょう

また、セッター・ゲッターが分かったら、コードが簡略化されるのでattr_accessorも積極的に使っていきましょう!

それでは、また

-Ruby
-

Copyright© 初心者のためのプログラミング独学ブログ , 2020 All Rights Reserved Powered by STINGER.