BETA

Ruby ターミナル内アプリの作り方③ (インスタンスの使い方)

投稿日:2020-09-04
最終更新:2020-09-04

今回はTwitterで知り合ったあっこさんに教えて頂いた、
八百屋さんアプリの作り方をまとめていきます。

八百屋さんアプリ(メソッドバージョン~インスタンス変数編)

まずは①で作成した完成形のコードから。。

menus = [  
  {name: "とまと", price: 100},  
  {name:"にんじん", price: 200},  
  {name:"かぼちゃ", price: 300},  
  {name:"スイカ", price: 1000}  
]  

menus.each.with_index(1) do |menu,i|  
  puts "#{i}.#{menu[:name]}(¥#{menu[:price]})"  
end  

print "商品を選択 > "    
order = gets.chomp.to_i    
select_menu = menus[order - 1]   

print "#{select_menu[:name]}ですね。何個買いますか。>"    
count = gets.chomp.to_i     

total_price = select_menu[:price] * count    
if count >= 5    
  puts "5個以上なので20%割引となります"    
  total_price *= 0.8    
end    
puts "合計金額:¥#{total_price.floor}"   

クラス・ゲッターの設定

class Menu  
   #ゲッター  
  def name  
    @name  
  end  

  def price  
    @price  
  end  

end  

ちょっと長い。。でも大丈夫!!!
ゲッターは下記のように省略できる!!!

class Menu  
  attr_reader :name  
  attr_reader :price  
end  

だいぶ短くなった!!!
今回はインスタンス変数を呼び出すだけなのでゲッターのattr_readerを使う!!!

initializeメソッドで初期値の設定からメニューの表示

class Menu  
  attr_reader :name  
  attr_reader :price  

  def initialize(**params)  
    @name = params[:name]  
    @price = params[:price]  
  end  
end  

menus = [  
  Menu.new(name: "とまと", price: 100),  
  Menu.new(name:"にんじん", price: 200),  
  Menu.new(name:"かぼちゃ", price: 300),  
  Menu.new(name:"スイカ", price: 1000)  
]  

menus.each.with_index(1) do |menu,i|  
  puts "#{i}.#{menu.name} #{menu.price}円"  
end  

initializeメソッドはインスタンス化と実行が同時にされるメソッド。
インスタンス変数の初期値の設定に使う。
クラス外でインスタンス変数を使う場合は #{menu.name} を使う。(.name がポイント!!!)
クラス内で使う場合は#{@name} を使う!!! ( @name だよ!!!)
これを実行すると。。

1.とまと 100円  
2.にんじん 200円  
3.かぼちゃ 300円  
4.スイカ 1000円  

メニュー表示できた!!!

メニュー番号・個数をターミナルでの受け取り方 

受け取るので、クラス外の each 文の下にコードを記載する。

print "商品を選択 > "  
order = gets.chomp.to_i  
select_menu = menus[order - 1]  

print "#{select_menu.name}ですね。何個買いますか。>"  
count = gets.chomp.to_i  

ここでもクラス外なので、、商品名は#{select_menu.name}となる。
(商品選択した番号をー1したインデックス番号を代入してる select_menu の.nameで表示される。)

合計金額のメソッドの作り方 

まずは、、メソッドを作らず、クラス外の一番下に記載してみる

total_price = select_menu.price * count  
  if count >= 5  
    puts "5個以上なので20%割引となります"  
    total_price *= 0.8  
  end  
  puts "合計金額:¥#{total_price.floor}"  

これを puts "合計金額○○○"以外を class Menuの1番下に入れると。。

class Menu  
#・・・・ゲッター・initializeメソッドなどの一番下に記載する・・・  
def get_total_price(count)  
    total_price = @price * count  
    if count >= 5  
      puts "5個以上なので20%割引となります"  
      total_price *= 0.8  
    end  
    return total_price.to_i  
  end  

end  

print "商品を選択 > "  
order = gets.chomp.to_i  
select_menu = menus[order - 1]  

print "#{select_menu.name}ですね。何個買いますか。>"  
count = gets.chomp.to_i  

puts "合計金額:¥#{select_menu.get_total_price(count)}"  

はい!!!ここが難しいと思います。。
get_total_priceだけでいいと思っていませんか。。だめなんです。。
count はクラス内で定義されてないので。。
引数として渡してあげないクラス内では使えません。
結果 #{select_menu.get_total_price(count)}
get_total_priceメソッドの引数は(count)となります。。
これをつなげると、、完成です!!!


これを作ることで。。
インスタンス変数・クラスの使い方が分かるようになりました!!!
配列だけの時は menu[:name]
クラス内でインスタンス変数を使う場合は#{@name}
クラス外でインスタンス変数を使う場合は #{menu.name}
頭のからまっていた糸がほどけました!!!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

アラフォーから始めるプログラミング!!!目指せエンジニア☆☆

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう