我收到recursive value foo needs type
以获取以下代码:
object Repro {
private final case class Foo(bar: Boolean = false)
def repro = {
val foo = Foo(bar = true)
val Foo(bar) = foo
}
}
但是,重命名未应用的字段可以很好地编译。
object Repro {
private final case class Foo(bar: Boolean = false)
def repro = {
val foo = Foo(bar = true)
val Foo(bar1) = foo // <- Here
}
}
我不确定导致这种情况的原因 - 在unapply中使用bar
无法引用Foo
中的字段名称...
答案 0 :(得分:2)
我不确定是什么导致这种情况 - 在unapply中使用bar不可能引用Foo中字段的名称......
反过来说:编译器认为Foo(bar = true)
是指下一行中定义的bar
(因为在Scala中,the scope of a name introduced by a declaration or definition is the whole statement sequence containing the binding)。这就是为什么它说“递归值foo
”:foo
使用bar
而bar
使用foo
。
如果指定foo
和bar
的类型,则不会进行类型检查,如果确实存在,则会出现前向引用错误,但编译器会在到达之前停止。< / p>
答案 1 :(得分:0)
栏是其表达式的私有参数。因此,您将其更改为bar1,错误已修复。
我不太清楚第二行val Foo(bar)=foo
如果我不明白这一点,我会删除我的答案。