3

基本上我正在尝试回答一系列 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)>'

我尝试的任何其他引发的错误都不起作用,我正在努力寻找正确的方向来解决这个问题。也许我找错地方了?

很抱歉再次问这个问题,但我已经尝试了一切并且不想有任何错误。如果你想查看其他线程的评论,这里是 URL

4

2 回答 2

3

这里的主要问题是Kernel#raise不接受块 ( {...}) 作为参数。它接受异常或字符串。

您面临的下一个问题是缺少括号。虽然在许多情况下您可以省略括号,但您不能一直这样做。原因是不同的运算符优先级。运算符优先级可能会混淆开发人员并导致 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
  # ...

你会注意到我还明确地告诉了异常的种类:ArgumentError似乎最好地描述了这个问题。我会以不同的方式命名变量。

每种语言都有自己的风格、最佳实践、命名约定和习语。理解和遵循这些约定是值得的。您可能想查看著名的 Ruby 样式指南,例如:

于 2016-11-12T07:50:49.640 回答
1

更改raise {"calculator is empty"}raise("calculator is empty"). raise可以接受字符串参数而不是块。

于 2016-11-12T05:03:12.137 回答