ProgateでRubyを学ぶ【コース5はオブジェクト指向】

ProgateのRubyコース5

Progate Rubyコース5

ProgateのRubyコース5はRubyの最終コースになります。

コース1~4で学ぶ内容は下記のとおりです。

Rubyコース1 文字列操作と数式、条件分岐
Rubyコース2 繰り返しと配列とハッシュ
Rubyコース3 メソッド関係
Rubyコース4 クラス全般

このなかでもコース4は結構重要な部分だったのではないかと思います。

Rubyの勉強をしたいと人はこんな本を買うのをおすすめします↓

それかProgateやるかですね。Progateは980円なので本買うよりも安いですね。

それかもしくはこれまでの内容の記事をみてもよいかもしれないです。

それではProgateのRubyコース5を備忘録的な形で書いていきたいと思います

クラスの継承

クラスの継承はクラスに新しい機能を追加したいときにいちからつくるのが面倒なので既存クラスを継承して新たなクラスとして機能を追加していくみたいです。

Rubyの継承は extends キーワードはつかわずに < という記号を使います 以下に2つのファイルを示して継承を行う例をみていきます。


Menuクラスが定義されているmenu.rb↓

class Menu
  attr_accessor :name
  attr_accessor :price
  def initialize(name:, price:)
    self.name = name
    self.price = price
  end
  def info
    return "#{self.name} #{self.price}円"
  end
end 

Menuクラスを継承するfood.rb↓

require "./menu"
class Food < Menu
end

mainの処理を行うrubyファイルindex.rb↓

food1 = Food.new(name: "かつどん", "500")
puts food1.info

こんな感じで継承でできた子クラスは親クラスのインスタンスメソッドやプロパティを使うことができますね。

Menuクラスを継承したクラスFoodクラス

Menuクラスを継承したクラスFoodクラスも同様に インスタンス変数やインスタンスメソッドが定義できます

Menuクラスを継承したクラスfood.rb

require "./menu"
class Food < Menu
attr_accessor :calorie
def calorie_info
  return "#{self.name}は#{self.calorie}kcalです"
end
end

メソッドのオーバーライド

親クラスのメソッドを子クラスで上書きすることができるのがオーバーライドです。
子クラスのインスタンスは、子クラスで定義したメソッドを優先して呼び出すようになっています。

この記事のはじめのほうにでてきたMenuクラスはinfoメソッドが定義されていますが、これをFoodクラスで上書きします。

Foodクラスが定義された food.rb

require "./menu"
class Food < Menu
attr_accessor :calorie
def calorie_info
  return "#{self.name}は#{self.calorie}kcalです"
end
end

initializeメソッドのオーバーライド

initializeメソッドはインスタンスを生成したときに自動で呼ばれるメソッドで値を初期化するときによくつかう。他のプログラミング言語では、コンストラクターといわれている。Rubyの場合def initializeで初期化を行う

initializeメソッドも子クラスでオーバーライド可能。

Menuクラスを継承したFoodクラスでinitializeメソッドをオーバーライドする

require "./menu"
class Food < Menu
  attr_accessor :calorie
  def initialize(name:, price:, calorie:)
    self.name = name
    self.price = price
    self.calorie = calorie
  end
  def info
    return "#{self.name} #{self.price}円 (#{self.calorie}kcal)"
  end
  def calorie_info
    return "#{self.name}は#{self.calorie}kcalです"
  end
end

メソッドの内の重複を親を呼び出すことで解決する super

superキーワードをかくと親クラスのinitializeメソッドがよばれる。PHPとかではparentキーワードだったがRubyではsuper

以下はコードの抜粋だがこんな感じで書くことができる

#initializeメソッドをオーバーライドしている例
  def initialize(name:, price:, calorie:) 
    super(name: name, price: price)
    self.calorie = calorie
  end

このコードの注意点はsuper()の引数にキーワード引数を使わなければならないこと。このへんはちょっとややこしくなるかもしれない

日付クラス

dateクラスを読みこむと日付クラスメソッドが使えるようです

require "date"
birthday = Date.new(2018, 8, 30)
puts birthday
puts birthday.sunday?

今日の日付を表示する

require "date"
today = Date.today
puts today
puts today.sunday?

クラスメソッド

クラスメソッドは他のプログラミング言語では 静的メソッド とか言われたりしているやつです。

Rubyのクラスメソッドの定義は

def クラス名.メソッド名
end

のようにして

呼び出すときは

クラス名.メソッド名 とかけばいいだけなので非常にシンプルになりますね

かなりコードは省略してあるけど、クラスメソッドを定義して呼び出したものが以下になります

  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    
    # if文を作成してください
    if count >= 1 && Menu.is_discount_day?
      total_price -= 100
    end
    
    return total_price
  end
  
  def Menu.is_discount_day?
    today = Date.today
    return today.sunday?
  end

Progate Rubyコース5まとめ

ProgateのRubyコース5はなんとこれで終わりです。もうちょっと深堀するのかと思いましたが、クラスの継承関係で終わってしまいました。もっといろんなことがあったと思いますが、重要な部分はこれくらいなのでしょうか。

今回学んだことをまとめます

  • クラスの継承 → < 記号を用いる
  • メソッドのオーバーライド → 子クラスでのメソッドの上書き
  • initilizeメソッドのオーバーライド → インスタンス変数の重複はsuper()を使う キーワード引数に注意
  • クラスメソッド -> Rubyのクラスメソッドはdef クラス名.メソッド名

ProgateのRuby全コースはこれでおわりです。もうちょっと難しい内容がでるかと思ったのですが意外に基本的な内容でした。RubyOnRailsでもっと難しい内容がでてくるようですね。