2

我已经看过几次了:

if foo = bar
  # do something
end

这在语法上合适吗?有区别吗?:

if foo == bar
   # do something
end
4

4 回答 4

7
if foo = bar
end

可以这样解读:

foo = bar
if foo
  # do stuff
end

ruby 中的赋值运算符返回一个已分配的值。这使得它在某些情况下非常有用,这要归功于 ruby​​ 对什么是真的什么不是真的有非常简单的规则。

这是一个在条件中使用赋值的典型示例(虽然不是一个好的示例,因为您应该使用文件each_line和块,但您明白了):

f = File.open(...)
while line = f.gets
  # do something with a line from file
end

另一方面,这是一个比较运算符,而不是赋值运算符。如果foobar相等,它返回一个布尔值。

if foo == bar

[编辑] 一个例子说明使用这种模式可能会对代码的冗长程度产生真正的影响。看看这个嵌套的条件表达式:

a = f(1)
result = if a
  b = g(a)
  if b
    c = h(b)
    if c
      2 * c
    end
  end
end

使用这种模式,我们可以改写(注意我如何围绕 assignments):

result = if (a = f(1)) && (b = g(a)) && (c = h(b))
  2 * c 
end
于 2013-01-28T17:48:48.873 回答
3

它们完全不同。第一个将分配 to 的值,bar然后foo评估该值是否为真(不是nilfalse)。第二个是直接比较。

于 2013-01-28T17:48:04.957 回答
2

第一个将 bar 的值分配给 foo。之后, foo 中的新值被评估为真或假。

第二个检查,如果 foo 和 bar 相同。

你在第一个中失去了 foo 的价值

于 2013-01-28T17:48:11.743 回答
0

这是有效的代码,但可能是一个无意的错误。

有些人可能会尝试对他们的代码感兴趣,并在同一行中同时执行赋值和 if 检查(如您的第一个示例),但它与常见的错字非常相似,因此它被称为“坏代码”之一为了清楚起见,应该避免气味。

于 2013-01-28T17:47:12.850 回答