shigamete02
@shigamete02

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ハッシュを含む配列から、該当するデータの添字を取得したいです。

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
0

1Answer

drinksのループ処理でeach_with_indexを使えばいいのではないでしょうか?

def money_calc(user) 
-    self.drinks.each do |drink|
+    self.drinks.each_with_index do |drink, num|
      if user.money >= drink.price
         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
1Like

Comments

  1. @shigamete02

    Questioner

    早速のご返信有難うございます。
    解決いたしました。
    each_with_indexとても便利そうです。勉強になりました。

Your answer might help someone💌