【问题标题】:Ruby operator confusionRuby 运算符混淆
【发布时间】:2012-09-15 20:56:58
【问题描述】:

任何人都可以就其工作原理提供一些指导:

self.primary_format == "Single" || self.primary_format == "EP"

但这不是

self.primary_format == "Single" || "EP"

有更简洁的方法吗?

我需要执行以下操作,并希望使其尽可能整洁。基于上述情况,我不确定以下内容能否正常工作。

self.release.primary_genre.id ==  3 || 6 || 8 || 12 || 18

非常感谢!

编辑: 我应该指出这些是 if 语句的一部分。

【问题讨论】:

    标签: ruby ruby-on-rails-3


    【解决方案1】:

    这是|| 的正常语义。您将self.primary_format"Single" 进行比较。如果不同,则以布尔方式检查 "EP"(如果不是 nil 而不是 false)。

    我更喜欢表达你的意思的方式是

    ["Single", "EP"].include? self.primary_format
    [3, 6, 8, 12, 18].include? self.release.primary_genre.id
    

    除了include?,您还可以使用等效的member?

    如果您想以更自然的顺序编写条件,请阅读Is there an inverse 'member?' method in ruby? 中的答案。

    【讨论】:

      【解决方案2】:

      让我们拆开第一个例子。

      self.primary_format == "Single" || self.primary_format == "EP"

      如果你应用运算符优先级并添加括号,你会得到:

      (self.primary_format == "Single") || (self.primary_format == "EP")

      因为#== 是一个方法,所以你得到这个:

      (self.primary_format.==("Single")) || (self.primary_format.==("EP"))

      让我们为self.primary_format 填写一个值。 "EP"怎么样。

      ("EP".==("Single")) || ("EP".==("EP"))

      两边调用#==方法就可以了

      (false) || (true)

      由于左边是假的,我们返回右边:

      true


      现在让我们拆掉第二个例子。

      self.primary_format == "Single" || "EP"

      如果你应用运算符优先级并添加括号,你会得到这个,因为== 的绑定比|| 更紧密:

      (self.primary_format == "Single") || ("EP")

      再一次,让我们将#== 切换到它的方法调用变体:

      (self.primary_format.==("Single")) || "EP"

      让我们再次为self.primary_format 填写"EP"

      ("EP".==("Single")) || "EP")

      拨打#==即可获得

      (false || "EP")

      由于|| 的左边是假的,所以返回右边。所以值为:

      "EP"

      这本身就是真的,因为它既不是false也不是nil


      因此,总而言之,您需要考虑像 ||== 这样的运算符如何将其两侧的表达式组合在一起。

      第一个例子说“如果这个值等于'Single',告诉我'true'。如果不是,如果它等于'EP',告诉我'true',否则告诉我'false'”

      p>

      第二个例子说“如果这个值等于'Single',告诉我'true'。如果不是,告诉我'EP'”。

      希望对你有帮助!

      【讨论】:

      • 谢谢,帮了大忙。
      【解决方案3】:

      在 ruby​​ 中,nil 和 false 被视为 Boolean false 意味着只有当它的值为 false 或 nil 时,您的条件才会失败。

      self.primary_format == "Single" || self.primary_format == "EP"
      

      在上面的语句中,您正在检查 primary_format 应该是“Single”还是“EP”,如果不是,它将失败。

      self.primary_format == "Single" || "EP"
      

      在上述声明中,您有两个声明 self.primary_format == "Single""EP" 因此,当其中任何一个正确时,您的条件就会通过。但是根据 ruby​​,除了 nil 和 false 之外的任何对象在布尔语句中都被认为是 true。在这种情况下,无论 self.primary_format 的值是什么,条件总是返回 true

      所以你必须使用数组的include?方法

      [3, 6, 8, 12, 18].include?(self.release.primary_genre.id )
      

      【讨论】:

      • primary_format 和 primary_genre 不返回数组,只是来自数据库的单个值,可以是我要检查的任何值。这似乎适用于 primary_format,但不适用于 primary_genre。
      • 我明白了......是self.primary_format的值
      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2019-12-29
      相关资源
      最近更新 更多