##はじめに
Progateで学習したRubyの内容を自分なりにまとめておく。
##クラスとインスタンス
「もの」を作る際の「設計図」をクラス、「もの」をインスタンスと呼ぶ
1. クラスを用意する
2. クラスからインスタンスを生成する
3. インスタンスに情報を追加する
# 1. クラスの用意
class クラス名
attr_accessor :シンボル # この情報のことをインスタンス変数という
def メソッド名 # インスタンスメソッド
処理
#{self.変数名} # インスタンス変数を使うことができる
end
end
# 2. インスタンスの生成
インスタンス名 = クラス名.new
# 3. インスタンスに情報を追加する
インスタンス.変数名 = 値
###インスタンスの初期化
initializeメソッド
クラス名.new
が実行されると、空のインスタンスが生成される。
initializeメソッドがあれば、自動で呼び出される。
例)
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name:, price:) # initializeメソッドに引数を渡す。
self.name = name
self.price = price
end
def info
return "#{self.name} #{self.price}円"
end
def get_total_price(count)
total_price = self.price * count
if count >= 3
total_price -= 100
end
return total_price
end
end
menu1 = Menu.new(name:"すし", price:1000)
puts menu1.info
##ファイルの分割
index.rb(プログラムの実行部分)とmenu.rb(クラスの定義部分)にファイルを分割する。
index.rb
require "./menu" # menu.rbの読み込み
menu1 = Menu.new(name:"pizza", ...)
...
menu.rb
class menu
attr_accessor :name
attr_accessor :price
...
end
###入力を受け取る
gets.chomp
を用いることで、コンソールが入力待機状態となる
変数 = gets.chomp # とすると入力された情報を文字列として受け取る
変数 = gets.chomp,to_i # とすることで、数値に変換することもできる
###ファイル分割の例
index.rb
require "./menu"
menu1 = Menu.new(name: "ピザ", price: 800)
menu2 = Menu.new(name: "すし", price: 1000)
menu3 = Menu.new(name: "コーラ", price: 300)
menu4 = Menu.new(name: "お茶", price: 200)
menus = [menu1, menu2, menu3, menu4]
index = 0
menus.each do |menu|
puts "#{index}. #{menu.info}"
index += 1
end
puts "--------------"
puts "メニューの番号を選択してください"
order = gets.chomp.to_i
selected_menu = menus[order]
puts "選択されたメニュー: #{selected_menu.name}"
puts "個数を入力してください(3つ以上で100円割引)"
count = gets.chomp.to_i
puts "お会計は#{selected_menu.get_total_price(count)}円です"
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
def get_total_price(count)
total_price = self.price * count
if count >= 3
total_price -= 100
end
return total_price
end
end
##継承
あるクラスを基にして新たなクラスを作ることを「継承」という
class 子クラス < 親クラス
attr_accessor :シンボル # 子クラスにインスタンス変数を追加する
def メソッド名 # 子クラスにインスタンスメソッドを追加する
# 子クラスで親クラスを同じ名前のメソッドを定義すると、子クラスの方が呼び出される(オーバーライド)
super(シンボル名: 引数) # 親クラスの同名メソッドを呼び出す
処理
end
end
###クラスメソッド
クラスに対して呼び出すメソッド
def クラス名.メソッド名
処理
end
クラス名.メソッド名 # で呼び出す
###インスタンスメソッドの定義
インスタンスに対して呼び出す
def メソッド名
###継承の例
Menuクラスを継承
food.rb
require "./menu" # 親クラスの読み込み
class Food < Menu # 子クラスの定義
attr_accessor :calorie # 子クラスのインスタンス変数
def initialize(name:, price:, calorie:) # オーバーライド
super(name: name, 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
##おわりに
次回はデータベースの基礎についてまとめようと思う。