【发布时间】:2014-06-08 18:42:19
【问题描述】:
不明白为什么@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
【问题讨论】:
-
请记住,在 Ruby 中,仅有的两个逻辑错误值是
nil和false。这使得使用== nil或.nil?与nil进行直接比较几乎总是多余的。unless @nums[-2] && @nums[-1]比你这里的更好。
标签: ruby