类型别名优化在 Scala 中跳过隐式转换?

Type alias optimization skipping implicit conversion in Scala?

我有以下代码:

  type RString = String

  implicit def stringToRString(s:String):RString = s.reverse

  val s = "The Force Awakens"
  val r:RString = s

  println(r)

我有点期待 rs 的反面,但它等于 s。 这是 Scala 编译器采用快捷方式吗,因为 RStringString 的别名,所以永远不会调用隐式转换?

类型别名不会引入 new 类型,它是一个 alias。您可以更换左侧和右侧。因此 r: RStringr: String 相同,因此不需要转换。

你需要这样的东西:

object RString {
  // allow RString to be used as a String
  implicit def toString(r: RString): String = r.toString
}
implicit class RString(val peer: String) extends AnyVal {
  override def toString = peer.reverse
}

val s = "The Force Awakens"
val r: RString = s  // "snekawA ecroF ehT"

也就是RString是一种新的类型,一个将字符串反转的值class。

您不需要别名,而是反转字符串的标记特征或标签。

scala> trait Reversed
defined trait Reversed

scala> def cv(s: String): String with Reversed =
     | s.reverse.asInstanceOf[String with Reversed]
cv: (s: String)String with Reversed

scala> implicit def cv(s: String): String with Reversed =
     | s.reverse.asInstanceOf[String with Reversed]
warning: there was one feature warning; re-run with -feature for details
cv: (s: String)String with Reversed

scala> val r: String with Reversed = "hi"
r: String with Reversed = ih