私はこのレッスンをやろうとしていますが、明らかに何かが欠けています!
「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] 終わり