私はこのレッスンをやろうとしていますが、明らかに何かが欠けています!
「rpn_calculator」が必要
RPNCalculator について説明する
attr_accessor :電卓
する前に
@calculator = RPNCalculator.new
終わり
それは「2つの数字を足す」
電卓.push(2)
電卓.push(3)
電卓プラス
計算機.値.べき== 5
終わり
...
# 追加クレジット
それは「文字列を評価する」
calculator.evaluate("1 2 3 * +").should ==
((2 * 3) + 1)
...
終わり
終わり
@numbers を除いて、私の初心者の目にはすべてが機能しています。evaluate メソッドから @numbers を設定しても、他のメソッドの @numbers には影響しません。その理由が本当にわかりません。@numbers を @@numbers に変更するなど、グーグルでできることはすべて試しましたが、何も役に立たないようです。評価メソッドで文字列を評価することもできました...しかし、私はすでに使用できる素晴らしいプラスメソッドを持っています!
クラス RPNCalculator
attr_accessor :数値
デフ初期化
@数字 = []
終わり
デフプッシュ(n)
@numbers.push(n)
終わり
デフプラス
@numbers.length > 1 ? @numbers.push(@numbers.pop(2).reduce(:+) ) : 失敗
終わり
デフマイナス
@numbers.length > 1 ? @numbers.push(@numbers.pop(2).reduce(:-) ) : 失敗
終わり
デフ・ディバイド
@numbers.length > 1 ? @numbers.push(@numbers.pop(2).inject{|x,y| x.to_f / y} ) : 失敗
終わり
定義時間
@numbers.length > 1 ? @numbers.push(@numbers.pop(2).reduce(:*) ) : 失敗
終わり
デフォルト値
@value = @numbers[-1]
終わり
デフトークン(pol)
pol.split(' ').map{|n| n.to_i.to_s == n ? n.to_i : n.to_sym}
終わり
デフ評価(ポール)
注文 = []
opps = {:+ => プラス、:- => マイナス、:/ => 除算、:* => 回 }
トークン(pol).reverse.chunk{|n| n.is_a?(整数)}.each{|e,a| e == 真? a.reverse.each{|a| push(a) } : a.each {|a| order.push(a) }}
order.reverse.each {|o| (opps[o]) }
終わり
絶対に失敗する
始める
raise Exception.new("電卓が空です")
終わり
終わり
終わり
結果は、@numbers が空であるため、プラスのリターンは失敗します....
RPN電卓
2 つの数値を加算します
3 つの数字を加算します
最初の数値から 2 番目の数値を減算します
加算と減算
掛け算と割り算
演算子の優先順位を明確に解決します
十分な値がスタックされていない場合、有益な失敗をします
文字列をトークン化します
文字列を評価します (FAILED - 1)
失敗:
1) RPNCalculator は文字列を評価します
失敗/エラー: calculator.evaluate("1 2 3 * +").should ==
例外:
電卓は空です
# ./12_rpn_calculator/rpn_calculator.rb:59:in `失敗'
# ./12_rpn_calculator/rpn_calculator.rb:14:in `plus'
# ./12_rpn_calculator/rpn_calculator.rb:39:in `評価'
# ./12_rpn_calculator/rpn_calculator_spec.rb:134:in `ブロック (2 レベル) in '
フランク・シュミット のおかげで、うまくいきました。どうやら、単にメソッドをハッシュに格納するだけではないようです。
正しい評価方法:
デフ評価(ポール)
@numbers = [] # @numbers をクリアせずに 4 つのテストを実行するため
opps = {:+ => Proc.new {plus}, :- => Proc.new{minus}, :/ => Proc.new{divide}, :* => Proc.new{times} } # メソッドインproc、ありがとう、フランク:D
トークン(pol).chunk{|n| n.is_a?(整数)}.each{|e,a| e == 真? a.each{|a| push(a) } : a.each {|o| (opps[o].call) }}
@数字[0]
終わり