1

我正在努力完成这一课,但我显然错过了一些明显的东西!

需要“rpn_calculator”

描述 RPNCalculator 做

  attr_accessor :计算器

  在做之前
    @calculator = RPNCalculator.new
  结尾

  它“添加两个数字”
    计算器.push(2)
    计算器.push(3)
    计算器.plus
    计算器.value.should == 5
  结尾

  ...

  # 额外积分
  它“评估一个字符串”做
    计算器.evaluate("1 2 3 * +").should ==
      ((2 * 3) + 1)

  ...

  结尾

结尾

除了@numbers,一切都对我的新手来说有效。从评估方法设置@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]
  结尾

  def 令牌(pol)
    pol.split(' ').map{|n| n.to_i.to_s == n ?n.to_i : n.to_sym}
  结尾

  def 评估(pol)
    订单 = []
    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计算器
  添加两个数字
  添加三个数字
  从第一个数中减去第二个数
  加减法
  乘除法
  明确地解决运算符优先级
  当没有足够的值堆积时会失败
  标记一个字符串
  评估一个字符串 (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 `evaluate'
     # ./12_rpn_calculator/rpn_calculator_spec.rb:134:in `block (2 levels) in '

感谢弗兰克施密特,我得到了它的工作。显然,不只是将方法存储在哈希中。

正确的评价方法:

  def 评估(pol)
    @numbers = [] # 因为这会进行 4 次测试而不清除 @numbers
    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 == 真?一个.每个{|一个| push(a) } : a.each {|o| (opps[o].call) }}
    @数字[0]
  结尾

4

1 回答 1

0

显然,只要将方法存储在 opps 哈希中,Ruby 就会调用它们。要解决此问题,您可以使用此修改后的代码版本:

  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

这个版本

  • 将 Procs 存储在 opps 哈希中,它只是调用您的方法
  • 使用 Proc.call 来实际调用你的方法
于 2014-02-11T11:57:31.133 回答