ProgateのRubyコース5
ProgateのRubyコース5はRubyの最終コースになります。
コース1~4で学ぶ内容は下記のとおりです。
Rubyコース1 | 文字列操作と数式、条件分岐 |
---|---|
Rubyコース2 | 繰り返しと配列とハッシュ |
Rubyコース3 | メソッド関係 |
Rubyコース4 | クラス全般 |
このなかでもコース4は結構重要な部分だったのではないかと思います。
Rubyの勉強をしたいと人はこんな本を買うのをおすすめします↓
それかProgateやるかですね。Progateは980円なので本買うよりも安いですね。
それかもしくはこれまでの内容の記事をみてもよいかもしれないです。
- ProgateでRubyの基本を学ぶ【コース1】
- ProgateでRubyを学んでみた【コース2】
- ProgateでRubyを学んでみた【コース3】
- ProgateでRubyを学んでみた【コース4はクラスが中心】
それでは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でもっと難しい内容がでてくるようですね。
コメント