在Scala中,=和:=有什么区别?

57
在Scala中,“=”和“:=”有什么区别?
我尝试过大量谷歌搜索“scala colon-equals”,但没有找到确切的答案。

20
在一个 SBT 的构建文件中,很可能会使用 := 这个赋值操作符。请参考 https://github.com/harrah/xsbt/wiki/Settings 了解 SBT 的所有赋值操作符。 - leedm777
1
你说得一点也没错,Dave。谢谢! - Jay Taylor
4个回答

93
在Scala中,=是真正的赋值操作符--它执行一些特定的操作,大部分情况下您不能控制,例如:
  • 当创建一个 val 或者 var 时给其赋值。
  • 改变一个 var 的值。
  • 改变一个类的字段值。
  • 定义一个类型别名。
  • 可能还有其他操作。
:= 不是内置操作符--任何人都可以重载它并定义它的含义。人们喜欢使用 := 是因为它看起来非常像赋值,并且在其他编程语言中也作为赋值操作符使用。
因此,如果您试图找出在您使用的特定库中 := 的含义... 我的建议是查看Scaladocs(如果存在),寻找命名为 := 的方法。

51
使用词语“assignmenty”巧妙地进行语法重载,赞!+1 - Heikki Naski

63

来自Martin Odersky:

  • 最初我们使用冒号等于符号表示赋值 - 就像Pascal、Modula和Ada一样 - 并使用单个等于号表示相等。很多编程理论家会认为这是正确的方式。赋值不等于相等,因此您应该使用不同的符号表示赋值。但后来我尝试与一些来自Java的人合作。他们的反应是,“嗯,这看起来是一门有趣的语言。但你为什么要写冒号等于?是什么意思?”然后我解释说在Pascal中是这样的。他们说,“现在我明白了,但我不明白为什么你坚持这样做。” 然后我意识到这不是我们想坚持的事情。我们不想说,“我们写冒号等于而不是等于号表示赋值,所以我们有一种更好的语言。” 这是一个非常小的点,人们可以适应任何一种方法。因此,在这些小事情上,我们决定不反对惯例,而是在其他地方做出差异。

来自Scala设计的目标


10
在我看来,最好使用 := 进行赋值操作,使用 == 进行相等性检查,而不要使用在语言上具有歧义的 =。不用 = 会更好。 - Ivan

6

= 表示赋值。 := 在标准库或语言规范中没有定义。如果您愿意,它是其他库或您的代码可以自由使用的名称。


5
Scala允许操作符重载,您可以像编写方法一样定义运算符的行为。与其他语言一样,“=”是赋值操作符。我不知道是否有名为“:=”的标准运算符,但您可以使用此名称定义一个运算符。如果您看到这样的运算符,请查看您正在查看的文档或搜索定义该运算符的位置。Scala操作符可做很多事情。 您基本上可以使用任何字符制作运算符。

2
感谢您纠正我的笔误,让我免于显得很蠢 ;) - thomasrutter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接