【Rubyの基本】classについて 後編

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

classメソッド

インスタンスを作らなくてもいきなり実行できるメソッドのこと。

def self.create(title, task)
 todo = Todo.new(title)
 todo.add_task(task)
 todo  #todo を return する
end

todo = Todo.create("Work","mail")
puts todo.discribe
# Work
#  【タスク】
# mail

class 継承

前編で作成したTodoクラス↓

class Todo

VERSION = 1

attr_accessor :title, tasks

 def initialize(title)
  @title = title
  # taskを配列で管理する
  @tasks =[]
 end

 def self.create(title, task)
  todo = Todo.new(title)
  todo.add_task(task)
  todo
 end

 def add_task(task)
  @tasks.push(task)
 end

 def discribe
  puts all_task_titles
 end

 private

 def all_task_titles
  "#{title}\n【タスク】\n#{tasks.join("・")}"
 end

end

Todoクラスを継承し、新たにKanbanクラスを作成する

(Todoクラスのコピーを作る感じ)

class Kanban < Todo
end

上記にメソッドをなにも追加せず、↓を書いてみる

kanban = Kanban.new("kanban")
kanban.add_task("洗濯")
kanban.add_task("掃除")

discribeを実行すると、todoの名前やtaskがしっかり返ってくる

kanban.discribe
# kanban
# 【タスク】
# 洗濯・掃除

継承後、クラスを拡張する

Todoクラスにないメソッドを追加して、Kanbanクラスを拡張する

class Kanban < Todo

  def delete_task(task)
  tasks.delete(task)
  end

end

実行すると↓になる

kanban.add_task("洗濯")
kanban.add_task("掃除")
kanban.add_task("買い物")
kanban.add_task("ゴミ出し")

kanban.discribe
# 【タスク】
# 洗濯・掃除・買い物・ゴミ出し

delete_task("ゴミ出し")
kanban.discribe
# 【タスク】
# 洗濯・掃除・買い物

親クラスでは定義されていない

Kanbanクラスでは「delete_task(task)」が定義されているが、親クラス(Todoクラス)では定義されていない

kanban = Todo.new("kanban")

kanban.add_task("洗濯")
kanban.add_task("掃除")
kanban.add_task("買い物")
kanban.add_task("ゴミ出し")

kanban.discribe
# kanban
# 【タスク】
# 洗濯・掃除・買い物・ゴミ出し

↓Todoクラスのインスタンスでは「delete_task(task)」が実行できずエラーになる

kanban.delete_task("掃除")
kanban.discribe
# undefined method `delete_task'

メソッド

delete

↑のように、配列からtaskを削除する(Arrayクラスのメソッド)

def delete_task(task)
 tasks.delete(task)
end

self

どのインスタンスかを指すとき「self」を用いることがある

def all_task_titles
 "#{title}\n【タスク】\n#{tasks.join("・")}"
end

def all_task_titles
 "#{self.title}\n【タスク】\n#{tasks.join("・")}"
end

なくても問題ないが、「self(自身)」という意味で、読みやすくなる

#DAY27

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



reCaptcha の認証期間が終了しました。ページを再読み込みしてください。