Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中使用单运算符等号的目的是什么?_Ruby - Fatal编程技术网

ruby中使用单运算符等号的目的是什么?

ruby中使用单运算符等号的目的是什么?,ruby,Ruby,我已经看过好几次了: if foo = bar # do something end 这在句法上合适吗?它与……有区别吗 if foo == bar # do something end 这是有效的代码,但可能是无意中的错误 有些人可能会对自己的代码感兴趣,并在同一行中同时进行赋值和if检查(如您的第一个示例),但它与常见的打字错误非常相似,因此众所周知,它是一种“糟糕的代码气味”,为了清晰起见,应该避免使用。它们完全不同。第一个将bar的值分配给foo,然后评估该值是否为真(不是

我已经看过好几次了:

if foo = bar
  # do something
end
这在句法上合适吗?它与……有区别吗

if foo == bar
   # do something
end

这是有效的代码,但可能是无意中的错误


有些人可能会对自己的代码感兴趣,并在同一行中同时进行赋值和if检查(如您的第一个示例),但它与常见的打字错误非常相似,因此众所周知,它是一种“糟糕的代码气味”,为了清晰起见,应该避免使用。

它们完全不同。第一个将
bar
的值分配给
foo
,然后评估该值是否为真(不是
nil
false
)。第二个进行简单的比较。

第一个将bar的值分配给foo。 之后,foo中的新值将按true或false进行计算

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

在第一个例子中,你失去了foo的值

if foo = bar
end
可以这样理解:

foo = bar
if foo
  # do stuff
end
ruby中的赋值运算符返回已赋值的值。这使得它在某些情况下非常有用,这要感谢ruby对什么是真什么不是有非常简单的规则

下面是一个典型的例子,其中赋值是在一个条件下使用的(虽然不是一个好的条件,因为对于您应该使用的文件和一个块,但是您知道了):

另一方面,这是一个比较运算符,而不是赋值运算符。如果
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
使用此模式,我们可以改为编写(注意我是如何编写的):


是赋值运算符。这可能也是一个输入错误(使用=而不是==是语言中难以发现的错误的常见来源)。@Wooble:或者简洁优雅的代码的来源:)@SergioTulentsev componence,是的(有些人会说简洁)。但是优雅?很有争议。@delnan:很明显,是口味的问题。我觉得它很优雅它只适用于那些迫使你声明变量并允许你将条件与声明结合起来的语言,这实际上是非常优雅的common@SergioTulentsev-真的吗?也许是因为我在其他语言中的背景,这类东西是反模式的,为了清晰起见,建议使用稍微长一点的形式(因此,查看代码的人知道这是故意的,而不是打字错误)。在我看来,不应该使用这种技术。因为读者必须花时间去弄清楚这个用法是打字错误还是故意的。如果作业是在另一行完成的话,那就不用动脑筋了。讨论得很好。事实上,我喜欢这个被截断的版本(现在我知道它的意思了),但是它需要一些时间来适应。是的,对于知道这个构造是什么的程序员来说是很好的。除此之外,几乎每个C编译器都会对这种赋值发出警告,这是有原因的。干杯。太棒了,非常感谢塞吉奥!我想补充两件事:1)它在具有多个分支的条件语句中非常有用,因此变量只在需要时分配。否则会导致更详细的分支结构。2) 有些()用惯用的
if(var=value)
来强调这是一个赋值。@tokland:请随意编辑帖子:)@SergioTulentsev:如您所愿:-)
a = f(1)
result = if a
  b = g(a)
  if b
    c = h(b)
    if c
      2 * c
    end
  end
end
result = if (a = f(1)) && (b = g(a)) && (c = h(b))
  2 * c 
end