Ruby操作员混淆

时间:2012-09-24 11:40:43

标签: ruby ruby-on-rails-3

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

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

但这不是

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

有更简洁的方法吗?

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

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

非常感谢!

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

3 个答案:

答案 0 :(得分:1)

在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之外的任何对象在布尔语句中都被认为是真的。在这种情况下,无论self.primary_format的值是什么,条件总是返回true

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

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

答案 1 :(得分: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 :(得分:1)

让我们拆掉第一个例子。

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"

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

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

致电#==,你就得到了

(false || "EP")

由于||的左侧是假的,因此返回右侧。所以价值是:

"EP"

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


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

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

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

我希望有所帮助!