理解“||”在Ruby中的if条件中的OR运算符

时间:2009-10-12 12:35:31

标签: ruby operators if-statement

简单地说,为什么以下三行的影响不相同?

if @controller.controller_name == "projects" || @controller.controller_name == "parts"

if @controller.controller_name == ("projects" || "parts")

if @controller.controller_name == "projects" || "parts"

第一个给了我想要的结果,但实际上有更多选项而不仅仅是项目和部分,使用该表单会创建一个详细的语句。另外两个更紧凑,但不会给我相同的结果。

9 个答案:

答案 0 :(得分:54)

||的确切语义是:

  • 如果第一个表达式不是nil或false,则将其返回
  • 如果第一个表达式为nil或false,则返回第二个表达式

所以你的第一个表达式是,如果@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]