【问题标题】:Can I have an implicit conversion method in a Scala case class?我可以在 Scala 案例类中使用隐式转换方法吗?
【发布时间】:2016-05-29 13:37:51
【问题描述】:

是否可以在一个类中拥有一个进行隐式转换的方法。在这种情况下,我希望能够立即将一个代表一对事物的对象解压缩成一个 2 元组。

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

鉴于我已经设法将隐式类型转换从一个类转换为另一个“正常工作”,我预计这里的问题更多与将元组定义为返回类型有关。谁能帮帮我?

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

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

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

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

    【讨论】:

    • 在这两个示例中,ab 都不需要注释它们的类型。元组类型,(String, String) 就够了。
    【解决方案2】:

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

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

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

    Scala 类型推断是从左到右工作的,所以它首先计算出foo0,并且没有预期的类型来触发隐式转换。只有这样它才能看到模式不可能匹配类型。

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多