【问题标题】:Ruby : What is the difference between " a = nil || 2008 " and " a = nil or 2008 " [duplicate]Ruby:“a = nil || 2008”和“a = nil or 2008”之间有什么区别[重复]
【发布时间】:2015-01-23 03:10:15
【问题描述】:

当我在 Irb 中评估表达式 a = nil || 2008 时,我得到的答案是 2008 并且 a 被分配了正确的值 2008 ||运算符返回他们的第一个参数,除非它是 falsenil

但是当我在 Irb 控制台上执行 a = nil or 2008 之类的操作时,a 被分配了 nil 并且我得到的表达式的评估返回值仍然是 2008

它与运算符优先级有关吗?我只是想知道为什么它会这样工作,有人可以解释一下吗?

【问题讨论】:

  • 这些运算符有不同的优先级。在这样的表达方式中总是使用||(除非你知道你需要or那里)

标签: ruby


【解决方案1】:

||or 具有不同的优先级。这本来是要使用的,例如错误处理:

foo = do_something_which_could_fail_and_return_nil_then(...) or deal_with_error(...)

有些人认为it should be avoided,即orand根本不应该使用。

【讨论】:

  • “有些人”成就了我的一天。
  • 感谢 undur_gongor,Ruby 风格指南的链接真的很有帮助。
【解决方案2】:

您的案例的优先顺序如下(从高到低):

  1. ||
  2. =
  3. or

所以这里a = nil || 2008

  • 操作1:nil || 2008
  • 操作 2:a = Operation 1

对于a = nil or 2008

  • 操作一:a = nil
  • 操作 2:Operation 1 or 2008 返回 2008,因为操作 1 是 nil

【讨论】:

  • 感谢 Rustam,一步一步的解释帮助我更好地理解它。
【解决方案3】:

你自己回答了。这是由于运算符优先级。 ||具有比 = 更高的优先级,“或”比 '=' 具有更低的优先级。 这是precedence table for ruby operators

如果你使用

a = (nil or 2008)

那么它会给出与

相同的结果
a = nil || 2008

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多