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
以上!!!