1

私はこのレッスンをやろうとしていますが、明らかに何かが欠けています!

「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]
  終わり

4

1 に答える 1

0

どうやら、Ruby はメソッドを opps ハッシュ内に格納するとすぐにメソッドを呼び出します。これを修正するには、この修正版のコードを使用できます。

  def evaluate(pol)
    order = []
    opps = {:+ => Proc.new {plus}, :- => Proc.new{minus}, :/ => Proc.new{divide}, :* => Proc.new{times} }
    tokens(pol).reverse.chunk{|n| n.is_a?(Integer)}.each{|e,a| e == true ? a.reverse.each{|a| push(a) } : a.each {|a| or
der.push(a) }}
    order.reverse.each {|o| (opps[o].call) }
  end

このバージョン

  • メソッドを呼び出すだけの opps ハッシュ内に Proc を格納します。
  • Proc.call を使用して実際にメソッドを呼び出します
于 2014-02-11T11:57:31.133 に答える