0

我试图了解 Scala for-loop 隐式框/拆箱“数字”类型的行为。为什么这两个第一个失败而其余的都不失败?

1) 失败:

scala> for (i:Long <- 0 to 10000000L) {}

      <console>:19: error: type mismatch;<br>
      found   : Long(10000000L)
      required: Int
              for (i:Long <- 0 to 10000000L) {}
                                  ^

2> 失败:

scala> for (i <- 0 to 10000000L) {}

      <console>:19: error: type mismatch;
      found   : Long(10000000L)
      required: Int
          for (i <- 0 to 10000000L) {}
                         ^

3)作品:

scala> for (i:Long <- 0L to 10000000L) {}

4)作品:

scala> for (i <- 0L to 10000000L) {}

4

2 回答 2

8

它与for循环无关:

0 to 1L   //error
0 to 1    //fine
0L to 1L  //fine
0L to 1   //fine

这只是因为to可用的方法Int期望 aInt作为它的参数。所以当你给它一个Long它不喜欢它时,你会得到一个错误。

这是该to方法的定义,可在以下位置找到RichInt

def to(end: Int): Range.Inclusive = Range.inclusive(self, end)
于 2012-03-27T11:40:14.747 回答
-3

数字类型的脱糖和隐式转换是不一致的,即与赋值操作相比,“for/comprehension”表达式之间存在差异。请随时证明其他情况或至少指出以下论点存在缺陷的地方:

事实上,在数字赋值期间,目标类型占主导地位。

var l:Long = 0变成:
val l: Long = 0L

var l:Long = 0.toInt变成:
var l: Long = 0.toInt.toLong

在“for/comprehension”表达式中,Source 类型占主导地位:

for (i:Long <- 0 to 1000000000L) { }变成:
0.to(1000000000L).foreach(((i: Long) => ()))

for (i <- 0L to 1000000000L) { } 变成: scala.this.Predef.longWrapper(0L).to(1000000000L).foreach[Unit](((i: Long) => ()))

(ps:使用“-Xprint:typer -e”编译器标志生成的输出。ds)

于 2012-03-27T16:18:17.893 回答