つかぱい.com

禅とギターとミクさんと

超初歩的なRubyのスクリプトで残業代を計算する。

Qiitaを今月もギリギリだけど書いたー 一応自分ブログにも書いておく クラス名はちょっと変えた

qiita.com

元ネタはこちら [Rubyでユーザのキーボード入力を対話的に受け取るRubyスクリプト] (https://qiita.com/na0AaooQ/items/65005f51c2430f74d2f0)

最近、仕事する時間が長くなってきて、コンソール上でこっそり残業代を計算するスクリプトが欲しいなーと思ったのでRuby超初心者が書いてみました。

やりたかったこと

  • スマホを取り出して電卓アプリを起動するものもはや面倒なのでなるべくキーボードから手を離さずになにか計算したい。
  • RubyのMatzさんの講演会を聞いたのでとりあえずなんでもいいからRubyでなにか書きたかった。
  • まあ、とりあえずやることが大事というモチベーションを維持したい。

実行環境

OS: MacOS Ruby: ruby 2.3.7

特にOSによる環境差異はないと思うのでRuby入れれば動くはず

ちょっと時間がかかったこと

問題点

gets.chompで対話的に入力値を取れるかな思ったけどString型になってしまうことを理解していなったので計算実行時こんなエラーが起きた

How_much_money.rb:51:in `calc_money': undefined local variable or method `"\u201D\u3042\u306A\u305F\u306E\u6B8B\u696D\u4EE3\u306F"' for #<HowMuchMoneyClass:0x00007fc50a8c4e58> (NameError)
        from How_much_money.rb:58:in `<main>'
MacBook-Pro:Ruby pcuser$ ruby How_much_money.rb
How_much_money.rb:51: syntax error, unexpected tIDENTIFIER, expecting keyword_end

解決策

計算のためには整数でないといけないのでInt型に変換するようにgets.to_iで数値を受け取って上げればおK

スクリプト本体

コンソールで使う場合は以下のように実行

$ ruby How_much_money.rb

今のこんな感じで出力されます。(要改良)

----------------------------
自分の残業代を計算しますか?
計算する場合は yes、キャンセルする場合は no と入力して下さい.
yes
  計算を実行します.
----------------------------
基準とする時給を入力してください
入力例:)1250
900
----------------------------
仕事をした時間を入力してください。
入力例:)80
40
あなたの残業代は 36000 円です

今の所こっそり感はゼロですが、まあ気にしない

特にひねりはないですがソースはこんな感じ

#!/bin/env ruby

## ----------------------------
# ユーザからのキーボードの入力を受け取り、
# yes と入力されたらスクリプトを実行する、no と入力されたらスクリプトを終了します.
## ----------------------------

class HowMuchMoneyClass

  def initialize

    puts <<-EOT
----------------------------
自分の残業代を計算しますか?
計算する場合は yes、キャンセルする場合は no と入力して下さい.
    EOT

  end

  def get_keyboard_input_yes_no

     case gets.chomp
       when "yes", "YES", "y"
         puts "  計算を実行します."
       when "no", "NO", "n"
         puts "  スクリプトを終了します."
         exit 1
       else
         puts "  yes または no を入力して下さい."
         confirm = HowMuchMoneyClass.new
         confirm.get_keyboard_input_yes_no
     end
   end

   def calc_money
        # 計算する場所
        puts <<-EOT
----------------------------
基準とする時給を入力してください
入力例:)1250
   EOT
        base_monoey = gets.to_i
        puts <<-EOT
----------------------------
仕事をした時間を入力してください。
入力例:)80
   EOT
        money_time = gets.to_i
       #計算結果を返す
       result = base_monoey * money_time
       puts "あなたの残業代は #{result} 円です"
   end
end


confirm = HowMuchMoneyClass.new()
confirm.get_keyboard_input_yes_no
confirm.calc_money

感想

コンフィグファイル的なやつを入れれば、コンソールに金額とかの情報を載せずともできそうなので今度改良してみようかなと思いました。

シェルとかPythonとか自分の好きな言語でこういうツールを作ってみるのもいいかもしれないですね。

他の人みたいにエクセレントな設計とかできないので思いついたものから地味にやっていくのがいいかな