scalac のバージョンによっては、合成メソッドがこのエラーを引き起こすバグがありました。
https://issues.scala-lang.org/browse/SI-6278
図では、f が生成されると想像してください。
object Test {
def main(args: Array[String]) {
class NotUsed {val x = f}
val dummy = false
def f = true
}
}
ケース クラス、デフォルト引数、および暗黙のクラスには、合成が含まれます。
そのチケットのサンプル コード (修正済み) では、関数の最後に暗黙を移動することで、ok メソッドを中断できます。
object tiny {
def main(args: Array[String]) {
ok(); nope()
}
def ok() {
class Foo(val i: Int) {
def foo[A](body: =>A): A = body
}
implicit def toFoo(i: Int): Foo = new Foo(i)
val k = 1
k foo println("k?")
val j = 2
}
def nope() {
implicit class Foo(val i: Int) {
def foo[A](body: =>A): A = body
}
val k = 1
k foo println("k?")
//lazy
val j = 2
}
}
それと戦う方法は何ですか?
コード内のコメントが示すように、定義を遅延させることは回避策です。
図 2、関数が長すぎて命名の問題に気付かないことを想像してください。
object Test {
def main(args: Array[String]) {
class NotUsed {val xs = args}
val dummy = false
// oops, shadows the parameter
def args = Seq("a","b","c")
}
}