30歳 独学で始めるプログラミング ~WEBデザイン・アプリ開発~

ITスキルに興味がでたので、codeを書いてみたら面白くてハマってしまいました!日々何をやったのかを中心に、記事を書いていきたいと思います。

41日目:Ruby Ⅳ:クラスとインスタンスを使いこなそう (クラス、インスタンス、インスタンスメソッド、ファイル分割)

<学習日>

41日目

<学習内容>

① Ruby Ⅳ (0-100):クラスとインスタンスを使いこなそう (クラス、インスタンスインスタンスメソッド、ファイル分割)

<参考>

Progateレベル:177

 

<学習内容詳細>

f:id:yakuzen_kokoro:20200814183124p:plain

本日はRuby Ⅳを全て終わらせることが出来ました^^

 

なんとなくRuby学習の本丸だった気がしますので、ここを乗り越えられたら、あとは具体的なWEBアプリを作ってみる感じになるかなと思っています!

 

ユーザーからの入力やクリックに対して、レスポンスして処理を行う部分の土台を学ぶことが出来ました^^

 

① Ruby Ⅳ (0-100):クラスとインスタンスを使いこなそう (クラス、インスタンスインスタンスメソッド、ファイル分割)

f:id:yakuzen_kokoro:20200814183322p:plain

f:id:yakuzen_kokoro:20200814183331p:plain

 

ということで、そこそこのボリュームがありましたが、内容はそこまで複雑ではなく、特に突っかかるところもなくこなすことが出来ました^^

 

やや難易度が高かったのは、インスタンス生成時に、「self」というcodeを用いて、クラス内の変数に値を入れなおす部分でした。

 

が、ここはPHPの学習時にコツとして会得した、「この言語で最終的にやりたいことはなにか」を考えることで解消することが出来ました!

 

内容としてはPHPという言語と、この部分に関しては同じかと思ったので、その時の考察を貼っておきますね^^

 

yakuzen-kokoro.hatenablog.jp

 

では、具体的な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日でも長く続けられるように頑張っていきます^^

同志の方、一緒に頑張っていきましょう!