简单地说,为什么以下三行的影响不相同?
if @controller.controller_name == "projects" || @controller.controller_name == "parts"
if @controller.controller_name == ("projects" || "parts")
if @controller.controller_name == "projects" || "parts"
第一个给了我想要的结果,但实际上有更多选项而不仅仅是项目和部分,使用该表单会创建一个详细的语句。另外两个更紧凑,但不会给我相同的结果。
答案 0 :(得分:54)
||的确切语义是:
所以你的第一个表达式是,如果@controller.controller_name == "projects"
,则表达式短路并返回true
。如果没有,它会检查第二个表达式。第二个和第三个变体基本上是if @controller.controller_name == "projects"
,因为"projects" || "parts"
等于"projects"
。你可以在irb中试试这个:
>> "projects" || "parts"
=> "projects"
你想做的是
if ["projects", "parts"].include? @controller.controller_name
答案 1 :(得分:7)
不同之处在于发生的事情的顺序。还有||没有做你认为在2和3中做的事情。
您也可以
if ['projects','parts'].include?(@controller.controller_name)
如果您需要添加更多匹配项,请在将来减少代码。
答案 2 :(得分:6)
||
也是一个空合并运算符,所以
"projects" || "parts"
将返回非空的第一个字符串(在本例中为“projects”),这意味着在后两个示例中,您将始终在评估:
if @controller.controller_name == "projects"
点击irb,你可以检查是否发生了这种情况:
a = "projects"
b = "parts"
a || b
返回projects
答案 3 :(得分:4)
那里有一些不同的事情:
if @controller.controller_name == "projects" || @controller.controller_name == "parts"
这给出了我想要的行为。逻辑是非常基本的:如果控制器名称是“projects”或“parts”
,则返回true另一种方法是:
if ["projects", "parts", "something else..."].include? @controller.controller_name
这将检查控制器名称是否在列表中的某个位置。
现在换其他例子:
if @controller.controller_name == ("projects" || "parts")
这不会做你想要的。它将首先评估("projects" || "parts")
(这将导致“项目”),然后只检查控制器名称是否等于。
if @controller.controller_name == "projects" || "parts"
这个甚至更加狡猾。这将永远是真实的。它将首先检查控制器名称是否等于“projects”。如果是,则语句的计算结果为true。如果没有,它会自行评估“部分”:在ruby中也会评估为“true”(出于布尔逻辑的目的,任何非零对象都被认为是“真”)
答案 4 :(得分:3)
基本上,==不会分配给其他运营商。 3 * (2+1)
与3 * 2 + 3 * 1
相同的原因是乘法分配超过加法。
||的值表达式将是其论据之一。因此第二个陈述相当于:
if @controller.controller_name == "projects"
||比{=}更低precedence,因此第3个语句相当于:
if (@controller.controller_name == "projects") || "ports"
答案 5 :(得分:2)
获得非详细解决方案的简单方法是
if ["a", "b", "c"].include? x
这实际上与||
无关,而是在ruby中认为什么值是真的。一切都是假的,零是真的。
答案 6 :(得分:1)
逻辑或运算符||适用于布尔表达式,所以使用 字符串上没有你想要的东西。
有几种方法可以实现您想要的更简洁,更易读的内容。
使用Array #include?和一个简单的if语句:
if ["projects", "parts"].include? @controller.controller_name
do_something
else
do_something_else
end
使用案例陈述:
case @controller.controller_name
when "projects", "parts" then
do_something
else
do_something_else
end
答案 7 :(得分:0)
首先将“projects”和“parts”字符串文字与@controller.controller_name
变量进行比较。
第二个评估(“projects”||“parts”),这是“项目”,因为“项目”字符串文字既不是false
,也不是nil
或空字符串,并将其与{{1}进行比较}
第三个比较@controller.controller_name
和“项目”,如果它们相等,则返回@controller.controller_name
,如果不是,则返回“部分”,等于true
{ {1}}陈述。
答案 8 :(得分:0)
我看到很多人都喜欢include?
比较。
我更喜欢使用.in?
运算符。它要简洁得多。而且更具可读性,因为我们不向数组提问,所以我们向您要问的变量提问:在您的情况下,为 controller name 。 / p>
@controller.controller_name.in? ["projects", "parts"]
或者更好
@controller.controller_name.in? %w[projects parts]