【问题标题】:Why does Scala define a "+=" operator for Short and Byte types?为什么 Scala 为 Short 和 Byte 类型定义“+=”运算符?
【发布时间】:2012-06-14 01:42:37
【问题描述】:

给定以下 scala 代码:

var short: Short = 0
short += 1        // error: type mismatch
short += short    // error: type mismatch
short += 1.toByte // error: type mismatch

我不质疑潜在的类型 - 很明显,“Short + value == Int”。

我的问题是:
1.有没有什么办法可以使用操作符?
2. 如果不是,那为什么运算符可以在 Short & Byte 上使用?

[以及扩展名 *=、|= &= 等]

【问题讨论】:

  • 其实 Short 没有方法 "+=" 或 "*=" ,你可以看一下 Short scala-lang.org/api/current/index.html#scala.Short 的文档。 x someoperator=y 由编译器自动转换为 x = x someoperator y。
  • @Eastsun 但是 Int 也不是 :-) a op= b 是扩展形式的语法糖:a = a op b,它解释了类型错误(Short + Short -> Int)。它没有解释为什么做出这个决定或者这个结构可能 - 或可能不 - 有什么用途。 (在 C# 中,使用 byte+=1 而不是 byte=byte+1 是完全合法的,并且行为在标准中是特定的——在 C# 中隐式转换回 LHS 类型。
  • @pst 是的,你可以在 Java 中和在 C# 中做同样的事情(如果我没记错的话。)
  • @Eastsun 天哪,我试着忘记那种语言;-) 我想有两种使它有用的方法是:1) 隐式强制转换/强制返回到 LFS (ala C#) 或 2) 使 Short + 短 -> 短;第一个只是没有根据 SLS 指定,所以这就留下了关于添加的类型提升的争论......(也许后者是为了处理 Java 类型提升?或者只是溢出错误?或者......)跨度>

标签: scala scala-2.8 scala-2.9


【解决方案1】:

问题似乎是Short类上的“+(Short)”定义为:

def +(x: Short): Int

所以它总是返回一个 Int。

鉴于此,您最终无法使用 += "operator",因为 + 操作的计算结果为 Int,它(显然)不能分配给脱糖版本中的“short” var:

short = short + short

至于你的第二个问题,它是“可用的”,因为当 scala 编译器找到如下表达式时:

x K= y

如果 x 是 var 并且 K 是任何符号运算符并且 x 中有 K 方法,那么编译器会将其翻译或“脱糖”为:

x = x K y

然后尝试继续编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2021-11-30
    • 2014-04-27
    • 2014-09-08
    • 2020-10-10
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多