类型别名优化在 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)
我有点期待 r
是 s
的反面,但它等于 s
。
这是 Scala 编译器采用快捷方式吗,因为 RString
是 String
的别名,所以永远不会调用隐式转换?
类型别名不会引入 new 类型,它是一个 alias。您可以更换左侧和右侧。因此 r: RString
与 r: 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
我有以下代码:
type RString = String
implicit def stringToRString(s:String):RString = s.reverse
val s = "The Force Awakens"
val r:RString = s
println(r)
我有点期待 r
是 s
的反面,但它等于 s
。
这是 Scala 编译器采用快捷方式吗,因为 RString
是 String
的别名,所以永远不会调用隐式转换?
类型别名不会引入 new 类型,它是一个 alias。您可以更换左侧和右侧。因此 r: RString
与 r: 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