不明白为什么@nums.pop在value方法中不起作用。它似乎告诉我它不能为nil做到这一点,但如果我只是说@nums,它表明数组中确实存在某些东西。那么为什么我不能把它弹出来呢?
class RPNCalculator
def initialize
@value = value
nums ||= []
@nums = nums
end
def push(num)
@nums << num
end
def plus
if @nums[-2] == nil || @nums[-1] == nil
raise "calculator is empty"
else
@value = @nums.pop + @nums.pop
@nums.push(@value)
end
end
def minus
if @nums[-2] == nil || @nums[-1] == nil
raise "calculator is empty"
else
@value = @nums[-2] - @nums[-1]
@nums.pop(2)
@nums.push(@value)
end
end
def divide
if @nums[-2] == nil || @nums[-1] == nil
raise "calculator is empty"
else
@value = @nums[-2].to_f / @nums[-1].to_f
@nums.pop(2)
@nums.push(@value)
end
end
def times
if @nums[-2] == nil || @nums[-1] == nil
raise "calculator is empty"
else
@value = @nums.pop.to_f * @nums.pop.to_f
@nums.push(@value)
end
end
def value
@nums #Don't understand why @nums.pop won't work here
end
def tokens(str)
str.split(" ").map { |char| (char.match(/\d/) ? char.to_i : char.to_sym)}
end
def evaluate(str)
tokens(str).each do |x|
if x == ":-"
minus
elsif x == ":+"
plus
elsif x == ":/"
divide
elsif x ==":*"
times
else
push(x)
end
end
value
end
end
错误与规范的以下部分有关:
it "adds two numbers" do
calculator.push(2)
calculator.push(3)
calculator.plus
calculator.value.should == 5
end
错误说:
Failure/Error: calculator.value.should == 5
expected: 5
got: [5] <using ==>
如果使用.pop,则为
Failure/Error: @calculator = RPNCalculator.new
NoMethodError:
undefined method 'pop' for nil:NilClass
答案 0 :(得分:1)
分配@value = value
的初始化方法调用def value
处的函数,该函数返回@nums
,其初始化时尚未创建,因为之后创建了@nums nums ||= []; @nums = nums
因此 nil 。这就是.pop不起作用的原因。
你已经将@nums创建为一个带有nums ||= []
的数组,并且你正在使用push和pop,所以为什么在调用{{{{{{{ 1}}返回一个(数组)。您需要将其写为value.first.should == 5或value [0] .should == 5 ...否则您应该更改值以仅返回您想要的元素
value
初始化方法中的问题是 @value = value 。修复此问题,然后您可以在值中添加.pop。
修改强>
此外,您的评估是在使用值填充@nums之前调用方法。然后方法“提出”错误。只有一个值被推送到@nums后才能调用减号。
以下是我如何分割字符串
的流程def value
@nums.pop # or @nums[0], or @nums.first or @nums.last however you plan on using it
end
我意识到这并不是你要解决这个问题的方法......但我认为按照数学顺序进行分割将是正确的方法。因此,首先评估()之间的所有内容,然后只进行乘法和除法,然后进行所有加法和减法。
编辑我刚看了一下RPN计算器是什么。所以不要介意我的分裂建议,因为它不适用。