我在一个工作正常的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是包含新修改的特征的文件。
答案 0 :(得分:3)
我刚遇到同样的问题。在我的情况下,它是由不必要的import
引起的,如下所示:
import scala.Predef.String
class Test() {
for (t <- 1 to 3) {}
}
默认情况下,Scala导入所有scala.Predef
。 Predef
扩展了LowPriorityImplicits
,其中包含从Int
到RichInt
的隐式转换。
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 => ... }