42日目:Ruby Ⅴ: クラスの機能を色々と使おう ローカル環境でRubyを動かそう(クラスの継承、オーバーライド、メソッドの継承、既存クラスの利用)
<学習日>
42日目
<学習内容>
① Ruby Ⅴ (0-100):クラスの機能を色々と使おう (クラスの継承、オーバーライド、メソッドの継承、既存クラスの利用)
② ローカル環境でRubyのcodeを書こう!
<参考>
Progateレベル:181
<学習内容詳細>
今日でProgateでのRuby学習は完了です^^
ローカルでの開発環境も整い、実際に適当に書いたcodeが正常に動くことまで確認できたので、他の言語のようにもう一周することはないかと思います!
スライド検索や自分で書き留めているノートで、不明点をさらうくらいで問題ないかなと思っています。
① Ruby Ⅴ (0-100):クラスの機能を色々と使おう (クラスの継承、オーバーライド、メソッドの継承、既存クラスの利用)
はい、ということで本日でProgateでのRubyの学習は完了です!
最後の「すでに用意されている」クラスの活用が、実際にcodeを0から作成するときには有用なのかもしれませんね^^
↓のようなサイトを参照するといいのかもしれません。
では、実際のcodeを挙げながら、振り返っていきます!
・クラスの継承について
既存のクラスの型を引きついで、細分化したクラスを作成するときに便利な方法となる。
たとえば、Menuクラスを引き継いで、Foodクラスを作成する場合は、具体的なcodeは以下のとおりとなる。
class Food < Menu
新しく作るクラスを先に記載して、「<」を加えてからもとになるクラスを記載すればオッケー。
また、上記の例ではFoodクラスのことを子クラス、Menuクラスのことを親クラスと呼ぶ。
・継承したクラスに新しいプロパティやメソッドを追加する場合。
新しく定義したクラスの中で、同じように定義するだけでOK
<プロパティの場合>
attr_accessor :プロパティ名
<メソッドの場合>
def メソッド名
処理内容
end
このとき、親クラスがすでに持っているプロパティや、メソッドはそのまま引き継がれるので、クラスの持っている型が増える形となる。
・親クラスのメソッドの上書きと継承について
親クラスで定義しているメソッドに対して、同じメソッド名で子クラスで再定義してしまうと、子クラスで定義したメソッドが適応される(上書き)。
例えばinitializeメソッドに対して、新しい引数を追加したい場合を想定して、実際のcodeは以下のとおり。
<親クラス>
def initialize(name:, price:)
self.name = name
self.price = price
end
<子クラス>
def initialize(name:, price:, weight:)
self.name = name
self.price = price
self.weight = weight
end
これで、子クラスに対してinfoメソッドを呼び出したとき、3つの引数を持つ関数として扱われる。
また、親クラスで定義しているメソッドの大部分を引きついで、子クラスで再度メソッドを再定義したい場合はsuperというcodeを使用する。
上記の例で具体的なcodeを記載すると、以下のとおり(親クラスは同じなので省略)。
<子クラス>
def initialize(name:, price:, weight:)
super(name:name, price:price)
self.weight = weight
end
・Rubyですでに定義されているクラス
Rubyでは自分で定義しなくても、最初から色々な機能やプロパティを持ったクラスを用意してくれている。
その一例として「Dateクラス」を取り上げる。最初から用意されているクラスの場合は、読み込みも「./」がいらいないなど、細かいところが少し違う。
(自分でもDateクラスを別途定義出来るように、呼び出し経路を分けているのだと推察する)
require "date"
birthday = Date.new(2000,1,1:自分の誕生日⇒年,月,日)
puts birthday
puts birthday.saturday?
このcodeでは、Dateメソッドを呼び出して、自分の誕生日を引数に値を渡して、そのあとに呼び出している。
また、その日付が土曜日であるのかどうかを判定させている。
さらにDateクラスでは、「Date.today」とすることで、今日の日付を引数に値を代入されたインスタンスを作成することができる。
このため、今日が土曜日であるかどうかの判定をする場合は、以下のようなcodeを自分で定義したクラスに入れればよい。
def クラス名.judge_day
today = Date.today
return today.saturday?
end
これで、今日の日付のインスタンスを作成したうえで、その日が土曜日であればtureを、土曜日ない場合はfalseをreturnしてくるメソッドが完成した。
・クラスメソッドについて
インスタンスを作成してから、メソッドを実行することが前提で動いてきたけれど、クラス自体に紐づけするメソッドもある。
例えばMenクラスに紐づいたメソッドを作成したい場合、具体的なcodeは以下のとおり。
def Menu.cout_up
処理
end
このように、メソッド名の前にクラス名を記載することで、クラスメソッドとして認識される。
② ローカル環境でRubyのcodeを書こう!
お決まりのコラムの記事で、ローカル環境でRubyを使用できるような環境構築の方法が記載されていましたので、それに沿ってRubyをAtomでcode出来るようにしてみました^^
基本的にはRubyのダウンロードページに行って、ダウンロードして、Atomでファイルを開いてcodeを書くという手順です。
実際にProgateで習ったような簡単なcodeを書いてみましたが、0から書くとエラーが頻発します^^;;
実際に0から書いてみることを積み重ねて、エラーの読み取り能力をあげることも大切と思います!
ちなみに私のエラーは以下のとおりでした。
・「requier」が定義されてないよ⇒requireのスペルミスで、Rubyで定義されていないcodeを書いていた
・「end」忘れてない?⇒クラスの定義のendを忘れていました。defのendで安心しがちなので気を付けよう
・「initialize」の引数に対して、値の数が合わないよ⇒キーワード方式にしていたのに、普通の引数に値を入れる形でcodeを書いていた。キーワードと対応するように書き直したら問題なくなった
ということで、無事ローカルでも今回習ったことを反映させることが出来たので、とりあえずはRubyは終了ということで、次は別の言語を見てみます!
もしかしたら、Progateの学習の合間に、「コンピューターサイエンス基礎」の勉強を書籍で始めるかもしれません。
ここの部分がしっかりしていないと、ローカル環境での開発で色々と詰まるきがしたので^^;;
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!