诊断Scala编译错误“值为不是Int的成员”

时间:2013-08-14 16:06:56

标签: scala compilation

我在一个工作正常的Scala类中进行了代码更改。在尝试编译修改时,编译器吐出与此(预先存在的)代码行相关的错误消息“value to is not member of Int”:

for (i <- 0 to cColumn -1) { ... }

做了一些研究,我遇到了一些关于“to”方法的bug报告 - 而且“to”显然是intWrapper类(?)中提供的方法。

所以,根据这些信息,我开始查看我的类的import语句......对于intWrapper没有这样的导入。 (问:在这种情况下,这首先是如何编译/运行的?)是什么让这更有趣(对我来说)是当我开始在代码库中进行全局搜索时,我意外地终止了编译器(sbt)会话...但是当我重新启动它时,该类编译得很好。完全没有错误。 (并且没有代码从前一个会话更改)

任何人都有任何想法会导致这种间歇性的行为吗?

注意:
1)使用Scala 2.10.2和javac 1.7.0_25
2)类的代码更改与示例功能无关,也没有改变任何类的导入

更新:以下是变量声明:

val meta = rs.getMetaData()
val cColumn = meta.getColumnCount()

编辑:根据建议,这里是测试行(现在所有编译好了):

implicitly[scala.Int => scala.runtime.RichInt]
intWrapper(3) to 4
for (i <- 0 to 33 -1) { /* do something smart */ }

for (i <- 0 to cColumn -1) { ... }

编辑2 以下是完整的编译错误:

[error] /path/to/src/file/DBO.scala:329: value to is not a member of Int
[error]       for (i <- 0 to cColumn -1) {
[error]

这个错误在课堂上重复了18次。 (这是一个DBO-DB接口层);其中DBO.scala是包含新修改的特征的文件。

3 个答案:

答案 0 :(得分:3)

我刚遇到同样的问题。在我的情况下,它是由不必要的import引起的,如下所示:

import scala.Predef.String

class Test() {
  for (t <- 1 to 3) {}
}  

默认情况下,Scala导入所有scala.PredefPredef扩展了LowPriorityImplicits,其中包含从IntRichInt的隐式转换。

to实际上是在RichInt上定义的,因此您需要进行此转换才能使用它。只导入Predef的一部分,我就失去了这种转换。摆脱不必要的import,错误就消失了。

答案 1 :(得分:1)

  

这首先是如何编译/运行的?

默认情况下,导入scala.Predef的内容。您可以使用方法intWrapper生成RichInt方法to

你可能有阴影符号intWrapper。以下是否有效:

implicitly[scala.Int => scala.runtime.RichInt]

或者这个:

intWrapper(3) to 4

......如果没有,那就是你的问题。


编辑:所以,既然你说要编译,那么你用一个常数替换cColumn会发生什么,例如

for (i <- 0 to 33 -1) { ... }

?使用指示的行等发布完整的编译器消息也是有帮助的。

答案 2 :(得分:0)

在不知道错误来自何处的情况下,您也可以尝试通过手工构建Range来解决它:

for (i <- Range.inclusive(0, cColumn-1)) { ... }

Range.inclusive(0, cColumn-1).foreach { i => ... }