“递归值需要类型”与案例类unapply

时间:2016-06-13 07:31:21

标签: scala

我收到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中的字段名称...

2 个答案:

答案 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使用barbar使用foo

如果指定foobar的类型,则不会进行类型检查,如果确实存在,则会出现前向引用错误,但编译器会在到达之前停止。< / p>

答案 1 :(得分:0)

哼,我没有足够的声誉来添加评论。我在这里发表我的想法:

第一行中的

栏是其表达式的私有参数。因此,您将其更改为bar1,错误已修复。

我不太清楚第二行val Foo(bar)=foo

的建议是什么

如果我不明白这一点,我会删除我的答案。