基本上我试图回答一系列Rspec指令。其中一条说明就是:
it "fails informatively when there's not enough values stacked away" do
expect {
calculator.plus
}.to raise_error("calculator is empty")
end
所以我了解了raise_error以及如何回答它,是我创建某种错误/异常。
def plus
@array_nums.length >= 2 ? @array_nums << @array_nums.pop + @array_nums.pop : raise {"calculator is empty"}
@value = @array_nums[-1]
要清楚底部有一个结尾,但文本编辑器没有处理它。所以我提出错误,我试图提出ArgumentError等等,但我不断从rspec得到这个回复:
Failure/Error:
expect {
calculator.plus
}.to raise_error("calculator is empty")
expected Exception with "calculator is empty", got RuntimeError with backtrace:
# ./lib/12_rpn_calculator.rb:16:in `plus'
# ./spec/12_rpn_calculator_spec.rb:119:in `block (3 levels) in <top (required)>'
# ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'
# ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'
我尝试过的任何其他错误的错误都不起作用,而我正在努力找到正确的方向来接受这个。也许我在找错了地方?
很抱歉再次提出这个问题,但我已尝试过所有内容,并且不想发生任何错误。如果要检查其他线程here is the URL的注释。
答案 0 :(得分:3)
这里的主要问题是Kernel#raise
不接受块({...}
)作为参数。它接受异常或字符串。
您面临的下一个问题是缺少括号。虽然在很多情况下你可以省略括号,但你不能一直这样做。原因是operator precedences不同。运算符优先级可能会使开发人员感到困惑,并导致Ruby以意想不到的方式读取代码。例如:
condition ? operation : raise "calculator is empty"
# what the devs thinks Ruby would understand:
condition ? operation : raise("calculator is empty")
# what Ruby really understands:
(condition ? operation : raise) "calculator is empty"
事实上 - 大多数已知的样式指南建议在大多数情况下不要省略括号,并允许在某些情况下省略作为例外。
此外,我觉得你只想在一个人身上做很多事情:有三个,两个pop
来电,一个任务和一个raise
。这使得代码难以阅读,难以理解且容易出错。在这个特定的例子中,我建议在方法的开头使用一个保护条款,并删除三元组:
def plus
raise(ArgumentError, 'calculator is empty') if @numbers.length < 3
@numbers << @numbers.pop + @numbers.pop
# ...
你会注意到我也明确告诉我exception的类型:ArgumentError
似乎最能描述这个问题。我会以不同的方式命名变量。
每种语言都有自己的风格,最佳实践,命名惯例和习语。值得理解并遵循这些惯例。您可能想要了解一个众所周知的Ruby样式指南,如:
答案 1 :(得分:1)
将raise {"calculator is empty"}
更改为raise("calculator is empty")
。 raise
可以采用字符串参数而不是块。