2012-03-27 88 views
0

我想了解Scala for循環隱式框/行動的「數值」類型的行爲。爲什麼這兩個首先失敗,而不是其餘?Scala的行爲/理解數值類型的隱式轉換?

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) {}

回答

8

它無關的for循環:

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

這只是因爲可供Intto方法期望的Int作爲其參數。所以當你給它一個Long它不喜歡它,你會得到一個錯誤。

這裏的to方法的定義中,關於RichInt發現:

def to(end: Int): Range.Inclusive = Range.inclusive(self, end) 
+0

在REPL或編譯器中是否有選項可用於從「for/comprehension」生成「de-shugard」輸出? – IODEV 2012-03-27 12:53:16

+0

是的,你可以使用'scalac -print'。 – drexin 2012-03-27 12:55:52

+0

謝謝,REPL的任何類似選項/開關? – IODEV 2012-03-27 13:26:12

-3

的脫糖和數字類型的隱式轉換是不一致即不同的「用於/理解」相比,分配操作的表達。請隨時以其他方式證明或至少指出以下參數有瑕疵的地方:

實際上,在數字賦值期間,目標類型占主導地位。

var l:Long = 0變爲:
​​

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:編譯標誌:與 「導電型測量儀-e -Xprint」 生成的輸出。 ds)

+0

術語是「_target typing_」[Martin O的書「Scala程序」第8.4節]。還有其他幾個參考文獻,例如「根據預期類型自動構建閉包(目標打字)」。但是這並不適用於(明顯)用於理解,即精神和邏輯模型不一致:另見:「http://stackoverflow.com/questions/9905659」 – IODEV 2012-04-01 09:53:42

+0

請不要在沒有離開評論爲什麼。謝謝! – IODEV 2012-04-01 11:14:41