我已经看过几次了:
if foo = bar
# do something
end
这在语法上合适吗?有区别吗?:
if foo == bar
# do something
end
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
另一方面,这是一个比较运算符,而不是赋值运算符。如果foo
和bar
相等,它返回一个布尔值。
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
它们完全不同。第一个将分配 to 的值,bar
然后foo
评估该值是否为真(不是nil
或false
)。第二个是直接比较。
第一个将 bar 的值分配给 foo。之后, foo 中的新值被评估为真或假。
第二个检查,如果 foo 和 bar 相同。
你在第一个中失去了 foo 的价值
这是有效的代码,但可能是一个无意的错误。
有些人可能会尝试对他们的代码感兴趣,并在同一行中同时执行赋值和 if 检查(如您的第一个示例),但它与常见的错字非常相似,因此它被称为“坏代码”之一为了清楚起见,应该避免气味。