Поведение Scala для / понимания неявного преобразования числовых типов? - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь понять поведение неявного блока / распаковки цикла for в Scala «числовых» типов. Почему два первых терпят неудачу, а не остальные?

1) Сбой:

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

2> Сбои:

scala> for (i <- 0 to 10000000L) {}</p> <pre><code> <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) {}

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Это не имеет ничего общего с циклом for:

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

Это просто потому, что метод to, доступный для Int, ожидает Int в качестве аргумента. Поэтому, когда вы даете ему Long, оно не нравится, и вы получаете ошибку.

Вот определение метода to, найденного в RichInt:

def to(end: Int): Range.Inclusive = Range.inclusive(self, end)
0 голосов
/ 27 марта 2012

Несоответствующее и неявное преобразование числовых типов противоречиво, т. Е. Различаются между выражениями «для / понимания» и операциями присваивания.Пожалуйста, не стесняйтесь доказать обратное или хотя бы точку, в которой приведенный ниже аргумент неверен:

Фактически, во время числового присваивания тип назначения является доминирующим.

var l:Long = 0 становится:
val l: Long = 0L

var l:Long = 0.toInt становится:
var l: Long = 0.toInt.toLong

Во время выражений «для / понимания» Тип источника доминирует:

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: outputгенерируется с помощью флага компилятора "-Xprint: typer -e". ds)

...