是否有一种标准方法来表示Scala中从一个对象到另一个对象的转换?

时间:2014-08-13 10:45:09

标签: scala

我在Scala中做了一个特性。

trait Convert {
  def to[T]: T
}

然后在我的班上我有:

case class SourceCode(code: String) {
  override def to[IndentedCode]: IndentCode = { ... }
}

这里我代表了一种将一个对象转换为另一个对象的方法。当我想要转换时,我会这样使用:

sourceCode.to[IndentedCode].toString

是否有标准方式来表示从一种类型到另一种类型的转换?人们是否会使用隐含因为他们可以进行自动类型转换,但那么你们如何将它们连在一起从一个转换到另一个?

1 个答案:

答案 0 :(得分:2)

我认为值得在这里退一步并定义你在这里做的事情。当你谈到类型转换时,你谈论的是A => BConvert的实施只有T(在这种情况下为B)。它没有指定它转换的内容。首先描述你需要的东西......

type Convert[A,B] = A => B

然后,您可以针对您想要的AB的任何值提供实施...

object int2string extends Convert[Int,String] {
  def apply(in: Int): String = in.toString
}

使用它当然很明显......

int2string(67)

如果你没有使用隐含,你可以就此止步。你已经完成了。

如果您使用的是implicits,则可以描述一种方法,允许任何类型转换implicit Convert可用于...

implicit class ConvertableOps[A](a: A) {
  def to[B](implicit convert: Convert[A,B]): B = convert(a)
}

然后,您可以让您将上述内容表达为......

67.to[String]

...或

67.to[SourceCode]

或者您想要的任何其他内容,假设隐含的Convert[A,B]在范围内。