Webエンジニア目指して#32-2

#32のアウトプットです

Foodsというクラスに名前とその数のインスタンス変数を与え、空の配列を用意しそこに食べ物のインスタンスを入れていくものです

gets.chomp.to_iのところで数字以外も入力できちゃうので工夫がいる、みたいなのを書きましたが、これは「getsで入力された文字列が自然数かどうか」で判定させることにしました

調べて辿り着いたのは「正規表現」です。ざっくり説明すると、めちゃくちゃ細かい指定ができるワイルドカードみたいなものです

その正規表現を使うと、ある文字列がお望みの文字列かどうか真偽値を返してくれます。 お望みの文字列のところを自然数にして、getsで数字以外を入力したらやり直しをさせるif文を書きました

loop do
    jdg_natural=gets
    if jdg_natural =~ /^[0-9]+$/ then
      food_alley[i].number=jdg_natural.to_i
      break
    else
      puts "個数は自然数のみで入力してください"
    end
  end

この部分ですね。最初はgetsの時点でint変換をしてましたが、integerは正規表現で比較すると常にnilを返しやがるので、一旦ただの文字列として取得して、自然数かどうか判定してからインスタンス変数に代入してます。 正規表現はstring型じゃないと動かない、ということですね。多分

loopメソッドを使ってみましたが、絶対に一度は通って条件分岐でやり直しをさせるものには結構便利ですね。

それ以外はゴリゴリ書いただけです。以下コードです

最後に実行結果のgifを載せます

class Foods
  attr_accessor:name
  attr_accessor:number

  def info
    return "名前:#{self.name} | 個数:#{self.number}"
  end
end

i=0
food_alley=[]

while i<5 do
  food_alley[i]=Foods.new
  puts "入荷物の名前を入力してください"
  food_alley[i].name=gets.chomp
  puts "入荷物の個数を入力してください(自然数のみ)"
  loop do
    jdg_natural=gets
    if jdg_natural =~ /^[0-9]+$/ then
      food_alley[i].number=jdg_natural.to_i
      break
    else
      puts "個数は自然数のみで入力してください"
    end
  end

  puts "入力結果 → #{food_alley[i].info}"
  i+=1
  if i>=5 then
    puts "入力終了"
  else
    puts "あと#{5-i}回入力可能です。続けますか?"
    cont_flag=0
    while cont_flag==0 do
      puts "続ける:y やめる:n"
      continue=gets.chomp
      if continue=="n" then
        puts "入力終了"
        cont_flag=1
        i=5
        break
      elsif continue=="y" then
        puts "入力を続けます"
        cont_flag=1
      else
        puts "yかnを入力してください"
      end
    end
  end
end

f:id:misokatsu_sand:20210123223651g:plain

以上!!!