我正在努力完成这一课,但我显然错过了一些明显的东西!
需要“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] 结尾