【发布时间】:2012-04-23 13:35:29
【问题描述】:
我有两个案例类定义如下
object Outer {
case class OuterCase(outerParam: Int)
object Inner {
case class InnerCase(innerParam: Int)
}
}
我想像这样获取他们实例的字段名称:
import scala.tools.nsc.interpreter.ProductCompletion
object EncapsulatedCase extends App {
val outer = Outer.OuterCase(1)
println("outer: " + new ProductCompletion(outer).caseNames)
val inner = Outer.Inner.InnerCase(2)
println("inner: " + new ProductCompletion(inner).caseNames)
}
这对于对象outer 可以正常工作,但对于inner 无效。这是输出:
outer: List(outerParam)
inner: List()
我看到的唯一区别是 InnerCase 类是在一个对象中定义的,它本身又在另一个对象中定义,而 OuterCase 只包含在一个对象中。
为什么会有问题?为什么我可以得到outer 的参数名称而不是inner case 对象?
我在 Scala 2.9.2 中观察到了这种行为。
谢谢!
一些附加说明
我注意到使用scala 或使用 sbt 从命令行运行相同的编译类有所不同。
从命令行:
julien@minare:~/prog/testing$ scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
julien@minare:~/prog/testing$ scala -cp target/scala-2.9.2/classes:/Users/julien/.sbt/boot/scala-2.9.2/lib/scala-library.jar:/Users/julien/.ivy2/cache/org.scala-lang/scalap/jars/scalap-2.9.2.jar:
/Users/julien/.sbt/boot/scala-2.9.2/lib/scala-compiler.jar org.example.EncapsulatedCase
outer: List(outerParam)
inner: List()
但是使用 sbt:
> scala-version
[info] 2.9.2
> sbt-version
[info] 0.11.2
> show external-dependency-classpath
[info] ArrayBuffer(Attributed(/Users/julien/.sbt/boot/scala-2.9.2/lib/scala-library.jar), Attributed(/Users/julien/.ivy2/cache/org.scala-lang/scalap/jars/scalap-2.9.2.jar), Attributed(/Users/julien/.sbt/boot/scala-2.9.2/lib/scala-compiler.jar))
[success] Total time: 0 s, completed Apr 24, 2012 9:20:21 AM
> run-main org.example.EncapsulatedCase
[info] Running org.example.EncapsulatedCase
outer: List()
inner: List()
任何关于找出这里发生的事情的提示将不胜感激。
【问题讨论】:
-
我在按该顺序排列的类路径。
-
scala-db.jar 和 scala-swing.jar 不是必需的(它们来自 Eclipse Scala 库包)
-
Scala 2.9.1.r0-b20110831114755 中的相同行为
-
在 Scala 2.9.0.1 上,两种情况我都有
List()。
标签: scala reflection inner-classes case-class