ハッシュを含む配列から、該当するデータの添字を取得したいです。
Q&A
Closed
解決したいこと
[ ]の中に選択肢の番号を入れたいです。
ーーーーーーーーーー
初めての質問のため、質問内容がうまく伝わるか不安ですが、
よろしくお願い致します。
そもそもできるかどうかも、わからないのですが、
できるのであれば、その手法を勉強できればと思い、質問いたしました。
ーーーーーーーーーー
Ruby2.6.5にて、下記のような流れの自動販売機のプログラムを勉強しました。
①【商品の登録】 drinkの名前name、価格priceを入力したハッシュを
drinksの配列に格納
②【一覧表示】 drinksに格納されたdrinkの一覧を表示。その際、配列の添字を
[i] drink名といった形でそれぞれ表示
③【金額投入】 投入金額moneyを入力
④【商品を選択】 添字の数値を入力
⑤【お釣りの返金】 moneyからpriceを差し引いてお釣りの金額を表示
これをもう少し自動販売機の動きに似せたいと思い
④の挙動の際に、投入金額に応じて購入可能なdrinkの選択肢を表示したいと思っております。
例)
[0]お茶 100円
[1]エナジードリンク 400円
[2]コーラ 200円
と一覧があった場合、300円を投入すると(購入可能な商品のみ再度表示)
[0]お茶 100円
[2]コーラ 200円
↑その際の[ ]の添字表示ができないかと悩んでおります。
ソースコード全体
class Drink
def initialize(name,price)
@name = name
@price = price
end
def name
@name
end
def price
@price
end
end
class VendingMachine
def initialize(drinks)
@drinks = drinks
end
def drinks
@drinks
end
def show_drinks
p 'いらっしゃいませ。商品を選択してください'
i = 0
self.drinks.each do |drink|
p "【#{i}】#{drink.name} #{drink.price}円"
i += 1
end
end
def money_calc(user)
self.drinks.each do |drink|
if user.money >= drink.price
num = ここの記述に悩んでいます。。。
puts "【#{num}】 #{drink.name} #{drink.price}円"
end
end
choosen_drink = user.choose_drink
drink_money = self.drinks.select{|n| n == drink.num}.price
change = user.money - drink_money
p "ご利用ありがとうございました。お釣りは#{change}円です。"
end
end
class User
def initialize(money)
@money = money
end
def money
@money
end
def choose_drink
gets.to_i
end
end
p '商品を用意'
drinks = []
3.times do |drink|
p '商品を入力'
name = gets.chomp
p '金額を入力'
price = gets.to_i
drinks << Drink.new(name,price)
end
vending_machine = VendingMachine.new(drinks)
vending_machine.show_drinks
p 'お金を投入してください'
money = gets.to_i
user = User.new(money)
vending_machine.money_calc(user)
該当するソースコード
def money_calc(user)
self.drinks.each do |drink|
if user.money >= drink.price
num = ここの記述に悩んでいます。。。
puts "【#{num}】 #{drink.name} #{drink.price}円"
end
end
choosen_drink = user.choose_drink
drink_money = self.drinks.select{|n| n == drink.num}.price
change = user.money - drink_money
p "ご利用ありがとうございました。お釣りは#{change}円です。"
end
end
自分で試したこと
num = drinks.index(drink.name, drink.price) や
num = drinks.search(drink.name, drinks)※定義は下記
等を試しましたが、うまくハッシュの検索、index番号の抽出ができませんでした。
def search(target, drinks)
drinks.each_with_index do |name, index|
if name == target
puts "#{index}"
end
end
end