我可以在 Scala case class 中使用隐式转换方法吗?

Can I have an implicit conversion method in a Scala case class?

是否可以在 class 中使用一个方法来进行隐式转换。在这种情况下,我希望能够立即将表示一对事物的对象解压缩为一个二元组。

case class Foo(a:String, b:String) {
  implicit def asTuple:(String, String) = (a,b)
}
val foo0 = new Foo("Hello", "World")

// Does not work!
val (a:String, b:String) = foo0

上面的例子是错误的。

这是我的第二次尝试 - 也失败了:

class Foo(a:String, b:String) {
  val _a:String = a
  val _b:String = b
}

implicit def asTuple(x:Foo):(String, String) = (x._a, x._b)

val foo0 = new Foo("Hello", "World")

// Does not work!
val (a:String, b:String) = foo0

鉴于我已经成功地将一个 class 隐式类型转换为另一个 'just work',我预计这里出现的问题更多与元组的定义有关return 类型。有人可以帮我吗?

您的第一个示例不起作用,因为您必须像在第二个示例中所做的那样在伴随对象或其他范围中定义隐式。 第二个示例似乎不起作用,因为 Scala 无法一步完成模式匹配和隐式转换。相反,将最后一行更改为以下内容之一以使其工作:

val (a:String, b:String): (String, String) = foo0

val (a: String, b: String) = foo0: (String, String)

这不起作用的原因是 = 在左侧有一个模式,如您的示例所示,完全等同于

foo0 match {
  case (a: String, b: String) => 
    // the rest of the body
}

(如果匹配不成功,将抛出 MatchError)。

Scala 类型推断是从左到右进行的,因此它首先计算出 foo0,并且没有预期的类型来触发隐式转换。然后它才发现模式不可能与类型匹配。