BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

メモ(Ruby IV)

クラスとインスタンス

プログラミングでメニューという「もの」を生成するには、まずその「設計図」を用意する必要があります。設計図のことをクラス、「もの」のことをインスタンスと呼びますので、覚えておきましょう。

インスタンス生成手順

  1. クラスを用意
  2. クラスからインスタンスを作成
  3. インスタンスに情報を追加

クラスを用意

クラスのデータを定義する方法の1つに「attr_accessor シンボル」を使う方法があります。Menuクラスのインスタンスにnameという情報を持たせることができます。このnameという情報のことをインスタンス変数と呼びます。
※attr=attribute=属性

class Menu
  attr_accessor:name
  attr_accessor:price
end

クラスからインスタンスを作成

menu1=Menu.new

インスタンスに情報を追加

menu1.name = "ピザ"
menu1.price=800

クラスの中でメソッドを定義して呼び出す

クラスの中で定義し、インスタンスに対して呼び出すメソッドのことをインスタンスメソッドと呼ぶ

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    puts "料理名と値段が表示されます"
  end

end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

menu1.info

self

正直、よく分からん。self:を消しても同じ結果になるし。

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    return "#{self.name} #{self.price}"
  end
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.info

総合演習(引数countが3以上なら100円引き)

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    return "#{self.name} #{self.price}"
  end
  
  def get_total_price(count)
    total_price=self.price*count
    if count>=3
      total_price-=100
      return total_price
    end
  end
  
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.get_total_price(3)

Initializeメソッド

インスタンスメソッドの中では、「self.変数名」でインスタンス変数を扱うことができるので、「self.変数名 = 値」でインスタンス変数に値を代入できる。

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize
    self.name= "ピザ"
    self.price= 800
  end
  
  def info
    return "#{self.name} #{self.price}"
  end

end
  
puts menu1.info

Initializeメソッドで引数を使う

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

menu1 = Menu.new(name:"すし" ,price:1000)

puts menu1.info

読み込み

require "./menu"

eachにて全メニューを表示

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]

menus.each do |menu|
  puts menu.info
end

番号を付ける

index=0

menus.each do |menu|
  puts "#{index}."+menu.info  
  index+=1
end

入力を受け取る

name=gets.chomp #このままだと、数字を入れても文字列扱いになる
count=gets.chomp.to_i #こうすると数値にしてくれる

総合演習(注文システム的なやつ)

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に代入してください
order=gets.chomp.to_i

# 選択されたメニューのインスタンスを変数selected_menuに代入してください
selected_menu=menus[order]

# 「選択されたメニュー: ○○」となるように出力してください
puts "選択されたメニュー: #{selected_menu.name}"

puts "個数を入力してください(3つ以上で100円割引)"

# 入力を数値として受け取って変数countに代入してください
count=gets.chomp.to_i

# 「お会計は○○円です」となるように出力してください
puts "お会計は#{selected_menu.get_total_price(count)}円です"
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