红宝石中单操作员等号的目的是什么?

时间:2013-01-28 17:44:53

标签: ruby

我已经看过几次了:

if foo = bar
  # do something
end

这在语法上是否合适?它有什么不同? :

if foo == bar
   # do something
end

4 个答案:

答案 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

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

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,然后评估该值是否真实(不是nilfalse)。第二个做了简单的比较。

答案 2 :(得分:2)

第一个将bar的值赋给foo。 之后,foo中的新值被评估为true或false。

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

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

答案 3 :(得分:0)

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

有些人可能会尝试使用他们的代码并同时执行任务和if检查同一行(就像你的第一个例子),但它与常见的拼写错误很相似,因为它是众所周知的为了清楚起见,应该避免“坏代码气味”。