Qiitaを今月もギリギリだけど書いたー 一応自分ブログにも書いておく クラス名はちょっと変えた
元ネタはこちら [Rubyでユーザのキーボード入力を対話的に受け取るRubyスクリプト] (https://qiita.com/na0AaooQ/items/65005f51c2430f74d2f0)
最近、仕事する時間が長くなってきて、コンソール上でこっそり残業代を計算するスクリプトが欲しいなーと思ったのでRuby超初心者が書いてみました。
やりたかったこと
- スマホを取り出して電卓アプリを起動するものもはや面倒なのでなるべくキーボードから手を離さずになにか計算したい。
- RubyのMatzさんの講演会を聞いたのでとりあえずなんでもいいからRubyでなにか書きたかった。
- まあ、とりあえずやることが大事というモチベーションを維持したい。
実行環境
特に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とか自分の好きな言語でこういうツールを作ってみるのもいいかもしれないですね。
他の人みたいにエクセレントな設計とかできないので思いついたものから地味にやっていくのがいいかな