任何人都可以就其工作原理提供一些指导:
self.primary_format == "Single" || self.primary_format == "EP"
但这不是
self.primary_format == "Single" || "EP"
有更简洁的方法吗?
我需要执行以下操作,并希望尽可能整洁。基于以上所述,我不确定以下内容是否正常。
self.release.primary_genre.id == 3 || 6 || 8 || 12 || 18
非常感谢!
编辑: 我应该指出这些是if语句的一部分。
答案 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'”。
我希望有所帮助!