2012-02-13 41 views
10

我有以下代码打印从1至9的数字在字母斯卡拉范围返回龙,而不是诠释

class IntToNumber(num:Int) { 
    val digits = Map("1" -> "one", "2" -> "two", "3" -> "three", "4" -> "four", "5" -> "five", "6" -> "six", "7" -> "seven", "8" -> "eight", "9" -> "nine") 
    def inLetters():String = { 
     digits.getOrElse(num.toString,"") 
    } 
} 

implicit def intWrapper(num:Int) = new IntToNumber(num) 
(1 until 10).foreach(n => println(n.inLetters)) 

当我运行这段代码我得到一个错误说的方法不可长期

Script.scala:9: error: value inLetters is not a member of Long 
(1 until 10).foreach(n => println(n.inLetters)) 
            ^
one error found 

更改最后一行

(1 until 10).foreach(n => println(n.toInt.inLetters)) 

工作正常..

有人可以帮我理解为什么(1到10)范围返回Long而不是int?

+0

令人费解。 '(1至10):IndexedSeq [Int]'表示表达式的类型为'NumericRange.Exclusive [Long]',因此归属无效。 '(1至10):IndexedSeq [Long]'起作用。 – missingfaktor 2012-02-13 13:14:53

+0

看起来像一个错误。执行'(1到2)foreach(x => println(x.getClass))'不会产生一致的结果。有时会打印“int”,有时会打印“long”。 – missingfaktor 2012-02-13 13:16:27

+0

哦,看起来像@ ziggystar解决了这个谜。 :-) – missingfaktor 2012-02-13 13:17:33

回答

14

我已将您的隐式转换的名称更改为intWrapperX。以下会话显示了固定示例。

问题是,您的intWrapper阴影scala.Predef.intWrapper(i:Int): RichInt这是需要创建Range对象。我留下解释为什么转换到Long(或可能的RichLong)踢入评论者。

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class IntToNumber(num:Int) { 
    val digits = Map("1" -> "one", "2" -> "two", "3" -> "three", "4" -> "four", "5" -> "five", "6" -> "six", "7" -> "seven", "8" -> "eight", "9" -> "nine") 
    def inLetters():String = { 
     digits.getOrElse(num.toString,"") 
    } 
} 

implicit def intWrapperX(num:Int) = new IntToNumber(num)  

// Exiting paste mode, now interpreting. 

defined class IntToNumber 
intWrapperX: (num: Int)IntToNumber 

scala> (1 until 10).foreach(n => println(n.inLetters)) 
one 
two 
three 
... 
+0

+1,奇妙的解释。 – 2012-02-13 13:28:49

+0

我希望SO早点告诉我你的答案。它让我花了13分钟搞清楚自己,然后打字我的答案中途,它告诉我关于这个:( – Dylan 2012-02-13 13:30:56

+2

非常感谢!我也学会了:粘贴模式,非常方便 – mericano1 2012-02-13 16:34:41