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
很奇怪的情况。
我有以下代码片段:
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