||之间有什么不同救援?

时间:2013-06-11 07:24:05

标签: ruby

在Ruby中使用||运算符和rescue之间有什么区别吗?

说:

b = A.value || "5"

b = A.value rescue 5

对象A没有value方法。

3 个答案:

答案 0 :(得分:9)

||是布尔运算符(请记住,在Ruby中,只有值nilfalse的计算结果为false,在布尔上下文中) :

nil || 5
# => 5

false || 5
# => 5

4 || 5
# => 4

rescue用于异常捕获:

fail 'bang' rescue 5
# => 5

'bang' rescue 5
# => "bang"

nil rescue 5
# => nil

在您的示例中,假设A没有回复value

A.value
# NoMethodError: undefined method `value' ...

b = A.value || 5
# NoMethodError: ...
b
# => nil

b = A.value rescue 5
b
# => 5

现在假设A.value返回nil

A.value
# => nil

b = A.value || 5
b
# => 5

b = A.value rescue 5
b
# => nil

答案 1 :(得分:8)

||or运营商。你的第一行是:

将b设为A.value;如果不是b(即b为零或假),则将其设置为字符串“5”。

Rescue让您可以从异常中恢复。你的第二行是:

将b设置为A.value。如果A.value引发异常,请忽略该问题并将b设置为5.

对于没有值方法的对象A,第一行将使应用程序崩溃。

对于value方法返回nil的对象A,第二行将b设置为nil。

答案 2 :(得分:2)

除了其他人已经告诉过你的内容之外,另外一个区别是,||是一个诚实的运算符,而内联rescue等于拯救StandardError,这就是rescue 3}}。换句话说,内联begin ... rescue ... else ... ensure ... end是一种不雅的黑客攻击,不应该在生产代码中过于频繁地使用。请改用正确的{{1}}声明。