LoginSignup
0
0

More than 3 years have passed since last update.

クラスとインスタンスで使うメソッドなど

Posted at

ゲッター

あるクラスのインスタンスのインスタンス変数の値を返すだけのメソッドのことです。これを定義することで、インスタンスから自身の持つインスタンス変数の値を取得することができます。
【例】MovieクラスとTicketクラスがあるとします。

movie.rb
class Movie
  def initialize(title, fee, start_date, end_date)
〜省略〜
  end

  def title  #ここから
    return @title
  end

  def fee
    return @fee
  end   #ここまでがゲッターの定義です
end
ticket.rb
class Ticket
  def initialize(movie)
    @title = movie.title   #movieクラスのインスタンス.titleで参照できます
    @fee = movie.fee   #movieクラスのインスタンス.feeで参照できます
  end
end

インスタンスは自身のインスタンス変数titleやインスタンス変数feeの値を返します。つまり、movieクラスのインスタンス.titleなどとすることで、それぞれの値を取り出せるようになったのです。

require

あるファイルから他のファイルの記述内容を参照するためのメソッドです。
例えばhoge.rbとfuga.rbいうファイルがあった時、fuga.rbにrequire "./hoge"と書くことでfuga.rbにhoge.rbの記述が書かれていることにしてくれます。
なぜまとめて書かないかというと、クラスの中身が大きくなってきた時に不便で、細かく分けると管理しやすいからです。
【例】

xxx.rb
require './movie'
require './ticket'

Dateクラス

【例】

xxx.rb
require './movie'
require './ticket'
〜省略〜
oceans_eleven = Movie.new(
                          "Ocean's Eleven",
                          1800,
                          Date.new(2020, 4, 4),
                          Date.new(2020, 6, 4)
                )

Date.new()は日付を表現するためのクラスです。Dateクラスを使って日付を扱えば、うるう年など日付関連の計算が楽になります。Dateクラスを利用するには明示的にrequireを使って読み込む必要があります。
Dateクラスのインスタンスには、第一引数から順に年、月、日の順で数字で値を渡します。
Rubyの公式ドキュメント

セッター

インスタンス変数の値を更新するためのインスタンスメソッドです。
【例】セッターを使用せずに値を更新する場合

yyy.rb
  def initialize
    @movies = []
  end
xxx.rb
   @movies = 更新したい値

【例】セッターを使用し値を更新する場合

yyy.rb
  def initialize
    @movies = []
  end

  def movies = (movies)   #セッターを定義してます
     @movies = movies
  end
xxx.rb
   yyy.moveis = [A,B,C]

「=が一つの代入式」に見えるのは、メソッド名に=が含まれていたからです。Rubyはメソッド名であっても半角スペースを無視するため、このようなことができます。

self

例えば映画の選択肢が出て、どれかを選択できる状態にできるとします(今回は1つしか設定していませんが、)。メッセージを出すためにputsメソッドを、ユーザーが選択肢を選べるようにgetsメソッドを使います。

puts "どの映画を見ますか?"
    i = 0
    self.movies.each do |movie|
      puts "#{i} #{movie.title}: #{movie.fee}円"
      i += 1
    end
    gets

インスタンスメソッドの中でselfと書くと、そのインスタンスメソッドを使っているインスタンス自身を参照できます。
つまり、self.moviesの返り値は今回の場合xxx.rbにある[oceans_eleven]となります。その後、eachメソッドで一つ一つのmovieが参照され、それぞれのタイトルと金額が並んで表示される形になります。

yyy.rb
class Yyy
  def initialize
    @movies = []
  end

  def movies
    @movies
  end

  def movies=(movies)
    @movies = movies
  end

  def display_menu
    puts "どの映画を見ますか?"
    i = 0
    self.movies.each do |movie|
      puts "#{i} #{movie.title}: #{movie.fee}円"
      i += 1
    end
    gets
  end
end

attr_accessor

ゲッター、セッターを簡単に定義できるメソッドです。
【例】

class Dog
  attr_accessor :name, :type, :age
end

以下の定義と同様の意味合いです。
【例】

class Dog

  def name
    @name
  end

  def name=(name)
    @name = name
  end

  def type
    @type
  end

  def type=(type)
    @type = type
  end

  def age
    @age
  end

  def age=(age)
    @age = age
  end

end
0
0
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
0
0