我已经看过几次了:
if foo = bar
# do something
end
这在语法上是否合适?它有什么不同? :
if foo == bar
# do something
end
答案 0 :(得分: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
另一方面,这是一个比较运算符,而不是赋值运算符。如果foo
和bar
相等,则返回布尔值。
if foo == bar
[edit]一个示例,演示使用此模式可能会对代码的详细程度产生实际影响。看看这个嵌套的条件表达式:
a = f(1)
result = if a
b = g(a)
if b
c = h(b)
if c
2 * c
end
end
end
使用这种模式我们可以改为编写(注意我surround the assignments):
result = if (a = f(1)) && (b = g(a)) && (c = h(b))
2 * c
end
答案 1 :(得分:3)
他们完全不同。第一个会将bar
的值分配给foo
,然后评估该值是否真实(不是nil
或false
)。第二个做了简单的比较。
答案 2 :(得分:2)
第一个将bar的值赋给foo。 之后,foo中的新值被评估为true或false。
第二个检查,如果foo和bar是相同的。
你在第一个中失去了foo的价值
答案 3 :(得分:0)
这是有效的代码,但可能是一个无意的错误。
有些人可能会尝试使用他们的代码并同时执行任务和if检查同一行(就像你的第一个例子),但它与常见的拼写错误很相似,因为它是众所周知的为了清楚起见,应该避免“坏代码气味”。