次のように定義された2つのケースクラスがあります
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)
}
これは objectouter
では期待どおりに機能しますが、 では機能しませんinner
。出力は次のとおりです。
outer: List(outerParam)
inner: List()
私が見る唯一の違いは、クラスInnerCase
が別のオブジェクトで定義されたオブジェクト自体で定義されているのに対し、クラスはOuterCase
1 つのオブジェクトのみに囲まれていることです。
なぜそれが問題になるのでしょうか?ケース オブジェクトのパラメータ名を取得できるのに、なぜケース オブジェクトを取得できouter
ないのですか?inner
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()
ここで何が起こっているのかを知るためのヒントをいただければ幸いです。