我在Scala中做了一个特性。
trait Convert {
def to[T]: T
}
然后在我的班上我有:
case class SourceCode(code: String) {
override def to[IndentedCode]: IndentCode = { ... }
}
这里我代表了一种将一个对象转换为另一个对象的方法。当我想要转换时,我会这样使用:
sourceCode.to[IndentedCode].toString
是否有标准方式来表示从一种类型到另一种类型的转换?人们是否会使用隐含因为他们可以进行自动类型转换,但那么你们如何将它们连在一起从一个转换到另一个?
答案 0 :(得分:2)
我认为值得在这里退一步并定义你在这里做的事情。当你谈到类型转换时,你谈论的是A => B
。 Convert
的实施只有T
(在这种情况下为B
)。它没有指定它转换的内容。首先描述你需要的东西......
type Convert[A,B] = A => B
然后,您可以针对您想要的A
和B
的任何值提供实施...
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]
在范围内。