元ネタはこちら
[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とか自分の好きな言語でこういうツールを作ってみるのもいいかもしれないですね。
他の人みたいにエクセレントな設計とかできないので思いついたものから地味にやっていくのがいいかな