【问题标题】:scala range returns Long instead of Intscala range 返回 Long 而不是 Int
【发布时间】:2012-02-14 03:52:32
【问题描述】:

我有以下代码可以用字母打印从 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))

当我运行此代码时,我收到一条错误消息,提示该方法不适用于 Long

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?

【问题讨论】:

  • 令人费解。 (1 until 10) : IndexedSeq[Int] 表示表达式的类型为 NumericRange.Exclusive[Long],因此归属无效。 (1 until 10) : IndexedSeq[Long] 有效。
  • 似乎是一个错误。执行(1 until 2) foreach (x => println(x.getClass)) 不会给出一致的结果。有时打印int,有时打印long
  • 哦,看来@ziggystar 解开了这个谜。 :-)

标签: scala types


【解决方案1】:

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

问题是,您的intWrapper 会影响创建Range 对象所需的scala.Predef.intWrapper(i:Int): RichInt。我将解释为什么转换为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
...

【讨论】:

  • 我希望 SO 早点告诉我你的答案。它让我花了 13 分钟自己弄清楚,然后在输入答案的中途它告诉我这个:(
  • 如果有人感兴趣,Long 可能是由 'NumericRange, which deals with stuff like 1L to 10L` 或 'a' to 'z' 生成的。不过,我不知道它是如何到达那里的。
猜你喜欢
  • 2012-12-24
  • 2023-03-29
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多