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