Scala中=和:=之间有什么区别?

Jay*_*lor 48 syntax scala colon-equals

=:=Scala有什么区别?

我已广泛搜索"scala colon-equals",但无法找到任何确定的内容.

Owe*_*wen 80

= 在scala中是实际的赋值运算符 - 它执行一些特定的事情,在大多数情况下你无法控制,例如

  • 在创建时给出一个valvar一个值
  • 改变一个的价值 var
  • 更改类上字段的值
  • 制作类型别名
  • 可能是其他人

:=不是内置的操作符 - 任何人都可以重载它并将其定义为他们喜欢的任何东西.人们喜欢使用的原因:=是因为它看起来非常具有任务性,并且在其他语言中用作赋值运算符.

因此,如果您正在尝试找出:=您正在使用的特定库中的含义...我的建议是通过Scaladocs(如果它们存在)查找名为的方法:=.

  • 使用"任务"+1这个词可以很好地超载语法 (42认同)

tol*_*ius 54

来自Martin Odersky:

  • 最初我们使用冒号等于赋值 - 就像在Pascal,Modula和Ada中一样 - 并且单个等号表示相等.许多编程理论家会认为这是正确的方法.赋值不是相等的,因此您应该使用不同的符号进行赋值.但后来我尝试了一些来自Java的人.我得到的反应是,"嗯,这看起来像一种有趣的语言.但你为什么要写结肠平等?这是什么?" 而且我在Pascal中解释过它.他们说,"现在我明白了,但我不明白为什么你坚持这样做." 然后我意识到这不是我们想要坚持的.我们不想说,"我们有一个更好的语言,因为我们写了冒号 - 而不是等于分配." 这是一个非常小的问题,人们可以习惯这两种方法.因此,当我们确实想要有所作为的其他地方时,我们决定不在这些小事情上对抗惯例.

来自斯卡拉设计的目标

  • 恕我直言最好使用`:=`进行赋值,使用`==`进行等式检查,而不是使用语言模糊的`=`. (9认同)

Rex*_*err 5

=执行任务. :=未在标准库或语言规范中定义.如果您愿意,这是一个可供其他库或您的代码免费使用的名称.


tho*_*ter 5

Scala允许运算符重载,您可以像编写方法一样定义运算符的行为.

与其他语言一样,=是一个赋值运算符.

这不是我知道调用的标准运算符:=,但可以使用此名称定义一个.如果您看到这样的运营商,您应该查看您正在查看的任何文档,或者搜索该运营商的定义位置.

很多,你可以使用Scala运营商做.实际上,您可以使用您喜欢的任何字符来创建操作符.

  • 感谢您纠正我的拼写错误并让我免于看起来像个白痴;) (2认同)