-1

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

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

但这并不

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

有没有更简洁的方法来做到这一点?

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

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

非常感谢!

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

4

3 回答 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?红宝石中的方法?.

于 2012-09-24T11:46:40.657 回答
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" 因此当其中任何一个正确时,您的条件都会通过。但是根据红宝石,在布尔语句中,除了 nil 和 false 之外的任何对象都被认为是 true。在这种情况下,无论self.primary_format条件的值是什么,总是返回 true

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

[3, 6, 8, 12, 18].include?(self.release.primary_genre.id )
于 2012-09-24T11:45:30.107 回答
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


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

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

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

我希望这会有所帮助!

于 2012-09-24T12:05:19.913 回答