Scala 命名参数:递归调用

Scala named argument: recursive call

很奇怪的情况。

我有以下代码片段:

case class SomeResponse(
    ok: Boolean,
    result: Seq[Data]
)

class TestContainer {

    def testMethod() = {

        val response = SomeResponse(
                  // vvv - issue is here
          ok = true, Seq(getStubData)
                  // ^^^
        )

        val result = Json.toJson(response)
    }

    def getStubData = Data(10, "James")
}

当我没有指定参数名称时,一切都按预期编译和工作。

但是当我显式设置参数名称时

val response = SomeResponse(
           // vvv - issue is here
ok = true, result = Seq(getStubData)
           // ^^^

编译器符合以下信息:

Error:(63, 30) recursive value response needs type
    val result = Json.toJson(response)

命名参数是否有任何特定的编译器行为?

这是 scala 中的一个半解决问题与 sbt 中的另一个问题之间相互作用的结果:

根据那里和链接问题中的评论判断,在类型推断期间,编译器以相同的方式处理所有 x = y 语句,从而在尝试推断上面的 result 时导致循环。

解决方法:

  • 提供上面result甚至response的显式类型;任何会打破类型推断循环的东西都可以
  • 重命名val result