41日目:Ruby Ⅳ:クラスとインスタンスを使いこなそう (クラス、インスタンス、インスタンスメソッド、ファイル分割)
<学習日>
41日目
<学習内容>
① Ruby Ⅳ (0-100):クラスとインスタンスを使いこなそう (クラス、インスタンス、インスタンスメソッド、ファイル分割)
<参考>
Progateレベル:177
<学習内容詳細>
本日はRuby Ⅳを全て終わらせることが出来ました^^
なんとなくRuby学習の本丸だった気がしますので、ここを乗り越えられたら、あとは具体的なWEBアプリを作ってみる感じになるかなと思っています!
ユーザーからの入力やクリックに対して、レスポンスして処理を行う部分の土台を学ぶことが出来ました^^
① Ruby Ⅳ (0-100):クラスとインスタンスを使いこなそう (クラス、インスタンス、インスタンスメソッド、ファイル分割)
ということで、そこそこのボリュームがありましたが、内容はそこまで複雑ではなく、特に突っかかるところもなくこなすことが出来ました^^
やや難易度が高かったのは、インスタンス生成時に、「self」というcodeを用いて、クラス内の変数に値を入れなおす部分でした。
が、ここはPHPの学習時にコツとして会得した、「この言語で最終的にやりたいことはなにか」を考えることで解消することが出来ました!
内容としてはPHPという言語と、この部分に関しては同じかと思ったので、その時の考察を貼っておきますね^^
では、具体的なcodeを挙げながら、振り返っていきます!
・クラスの作成/定義と出力方法
クラスは以下のように作成する。なお、前半がクラスのプロパティのようなもので、クラスが値を受け取れる「特徴」の枠。
後半がクラスが実行できる「処理」の枠で、メソッドと言ったりする。
<定義>
class Food
attr_accessor :name
attr_accessor :price
def info(name, price)
return "このメニューは#{self.name}で、値段は#{self.price}円です"
end
end
endはclassに対するものと、defに対するもので2つ必要となる。
「self.変数」とすることで、このクラス内で定義した変数に対して、外から値を入れたものをそのまま引用できる。
このときの出力方法の一例として、以下のようなcodeがある。
<出力方法>
menu1 = Food.new
menu1.name = "寿司"
menu1.price = 3000
puts menu1.info
<出力結果>
このメニューは寿司で、値段は3000円です
・メソッドを引数で定義して、値を突っ込んで合計の値段を計算させる。
例えば、たくさん買うと割引率が高くなるようなオプションも含めて、買う個数を指定すると、合計金額が得られるような仕組みを作ることが出来る。
今回は、上記の寿司に対して、2人前以上頼むと10%引き、5人前以上頼むと20%引きになるようにする。
<定義:クラスの中>
def final_total_price(count)
total_price = self.price * count
if count >= 5
total_price = total_price * 0.8
elsif count >= 2
total_price = total_price * 0.9
end
return total_price
end
<出力方法>
puts menu1.final_total_price(1)
puts menu1.final_total_price(2)
puts menu1.final_total_price(10)
<出力結果>
3000
5400
24000
returnには、成立した時点でそれよりも下のcodeを実行しない(endの範囲内で)という点に注意して、ifの条件式の書き方は順番を意識するのが大切。
・インスタンス生成時に値を自動で取得してしまう(特にプロパティに、個別のインスタンスが作成された時点で値を受け取る)
「initialize」という関数を使って、自動で値を受け取る機能を持たせることが出来る。
具体的なcodeは以下のとおり。
<定義:クラスの中>
def initialize(name:, price:)
self.name = name
self.price = price
end
このcodeを使うことで、色々な種類のインスタンスを作成したときに、このインスタンス内で用いる変数に、常に値が入った状態となる。
複数のインスタンスを使って、each関数と組み合わせると、どのように時短になるのか、以下のcodeで説明する。
<クラスの定義>
class Food
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
<出力方法>
menu1 = Food.new(name:"寿司", price:3000)
menu2 = Food.new(name:"お茶", price:200)
menu3 = Food.new(name:"いなり", price:500)
menus = [menu1, menu2, menu3]
memus.each do |menu|
puts menu.info
end
<出力結果>
このメニューは寿司で、値段は3000円です
このメニューは.お茶で、値段は200円です
このメニューはいなりで、値段は500円です
ということで、自動生成や、ユーザーが指定した値を受けての応答が出来るような未来が見えますね。
・ファイルを分けて、他のファイルから情報を受け取る方法
以下のcodeを、最初に張り付けるだけ。
require "./ファイル名"
・コンソールで値を打ち込ませて、その値を受け取る方法
具体的なcodeは以下のとおり。
文字列として受けたい場合⇒gets.chomp
数字として受けたい場合⇒gets.chomp.to_i
より具体的に、各メニューにメニュー番号を割り付けて、その番号を入力したら、メニュー名と番号を返すcodeを挙げると、以下のとおり。
<クラスの定義>
class Food
attr_accessor :name
attr_accessor :price
def initialize(name:, price:)
self.name = name
self.price = price
end
end
<出力方法>
menu1 = Food.new(name:"寿司", price:3000)
menu2 = Food.new(name:"お茶", price:200)
menu3 = Food.new(name:"いなり", price:500)
menus = [menu1, menu2, menu3]
index = 0
memus.each do |menu|
puts menu.info
index += 1
end
puts "メニュー番号を入力してください"
number = gets.chomp.to_i
select_menu = menus[number]
puts "選択したメニューは#{select_menu.name}です"
<出力結果>
メニュー番号を入力してください
1
選択したメニューはお茶です
こんな感じで、訪問者のクリックや入力に対応して、自動で処理をするシステムの基幹部分を担うことが出来そうです。
ということで、本日はこのくらいで終わりにしようと思います。
今日は時間に余裕があるので、7つの習慣を読み終えることと、税金について大河内さんの動画でがっつり勉強しようと思います!
(こうしてみると、プログラミングはあくまで趣味になっていますね^^;;)
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!