【问题标题】:Where is Scala's += defined in the context of Int?Scala 的 += 在 Int 的上下文中定义在哪里?
【发布时间】:2017-06-06 01:18:15
【问题描述】:

刚开始使用 Scala
var c = 0
c += 1 工作
c.+= 给了我error: value += is not a member of Int

+= 是在哪里定义的?

【问题讨论】:

    标签: scala operators


    【解决方案1】:

    Section 6.12.4 Assignment Operators of the Scala Language Specification (SLS) 解释了这种复合赋值运算符是如何脱糖的:

    l ω= r
    

    (其中ω 是除<>! 之外的任何运算符字符序列,并且不以= 开头)被脱糖为

    l.ω=(r)
    

    IFF l 有一个名为 ω= 的成员,或者可以隐式转换为一个具有名为 ω= 的成员的对象。

    否则,它会被脱糖

    l = l.ω(r)
    

    l 除外,保证只计算一次),如果类型检查的话。

    或者,更简单地说:编译器将首先尝试l.ω=(r),如果不起作用,它将尝试l = l.ω(r)

    这允许像 += 这样的东西像在其他语言中一样工作,但仍然被覆盖以做不同的事情。

    【讨论】:

      【解决方案2】:

      实际上,您描述的代码确实有效。

      scala> var c = 4
      c: Int = 4
      
      scala> c.+=(2)  // no output because assignment is not an expression
      
      scala> c
      res1: Int = 6
      

      我怀疑(但不能肯定地说)它在库中找不到,因为编译器将其去除(重写)为 c = c.+(1) 在图书馆。

      【讨论】:

      • 啊,所以 c.+= 实际上是糖而不是真正的函数? (不要给它一个参数)。
      • 我相信是的。当我在 IntelliJ 工作表中写 c. 时,我得到了一个可能完成的菜单,但 += 不在其中。
      • 我相信来自隐式解析的+=
      • @marios,我没找到。我尝试了scalac -Xlog-implicit-conversions test.scala,但没有任何迹象表明发生了隐式转换。
      • 这个重要的小部分:scala-lang.org/files/archive/spec/2.12/…
      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      相关资源
      最近更新 更多