先の例でクラスを作ったメリットはあまりなかったのですが、もうすこし 複雑になってくるとメリットがでてきます。 そこで先の電卓に関数電卓の機能を付けてみました。 メインループもクラス定義も、非常にそれぞれ均質なコードになっています。 均質なコードはバグが入りにくいと、経験上言えますし、 見た目がすっきりサワヤカなスクリプトは、私の趣味にぴったりします。 Perl はゼンゼンすっきりしないモノね。:-P
# --------------------------------------------------------- rpn3.rb ^ print "RPN CALC #3 of ruby, ready. by guel 02/20/99\n" class RpnCalc < Array include Math def set(x) push x.to_f end def add push pop + pop end def multi push pop * pop end def sub push (-pop + pop) end def div push 1 / pop / pop end def set_PI push PI end def set_E push E end def sin push super(pop) end def cos push super(pop) end def exp push super(pop) end def log push super(pop) end def log10 push super(pop) end def sqrt push super(pop) end def reciprocal push 1 / pop end def power push pop ** pop end def CLR pop end def AllCLR clear end end rpncalc = RpnCalc.new IS_NUM = /^\-?\d*(\.\d+)?(e(\+|\-)?\d*)?$/ # 符号、整数部、小数部、指数部 while gets split.each do |x| begin case x when IS_NUM rpncalc.set x when 'pi' rpncalc.set_PI when 'e' rpncalc.set_E when '+' rpncalc.add when '*' rpncalc.multi when '-' rpncalc.sub when '/' rpncalc.div when 'sin' rpncalc.sin when 'cos' rpncalc.cos when 'tan' rpncalc.tan when 'exp' rpncalc.exp when 'log' rpncalc.log when 'log10' rpncalc.log10 when 'sqrt' rpncalc.sqrt when '1/x' rpncalc.reciprocal when '^', '**' rpncalc.power when 'c', 'del' rpncalc.CLR when 'ac', 'reset' rpncalc.AllCLR else print "入力がヘンだぜ (^^;\n" p x end rescue print "例外処理が発生!!\n" p $! p $@ end end p rpncalc end # --------------------------------------------------------- rpn3.rb $ |
Count ->
update 1999-11-27, since 1999-11-27
Copyright (c) 1999 by guel. All rights reserved.