2

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

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

在做一些研究时,我发现了一些关于“to”方法的错误报告——而且“to”显然是 intWrapper 类中提供的一种方法(?)。

所以,基于这些信息,我开始查看我班级的导入语句...... 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 是包含新修改特征的文件。

4

3 回答 3

4

我刚刚遇到了同样的问题。就我而言,这是由不必要的 引起的import,如下所示:

import scala.Predef.String

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

默认情况下,Scala 导入所有scala.Predef. Predefextends ,其中包括从toLowPriorityImplicits的隐式转换。IntRichInt

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

于 2014-01-23T00:49:26.140 回答
1

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

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

或者

Range.inclusive(0, cColumn-1).foreach { i => ... }
于 2013-08-14T20:24:34.573 回答
1

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

默认情况下,scala.Predef会导入 的内容。那里有intWrapper产生RichIntwith 方法的方法to

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

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

或这个:

intWrapper(3) to 4

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


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

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

? 它还有助于发布带有指示行等的完整编译器消息。

于 2013-08-14T18:51:57.653 回答