[英]Scala implicit string conversions utility
我试着写一些字符串utils的是能够做到形式的隐式转换"myString".doSpecialConversion
并有specialValue
在此基础上doSpecialConversion
工作。
尝试1:使用特征:
trait ConversionUtils {
// Need an overridable value
lazy val specialValue = ","
implicit class StringConversions(val s: String) {
def doSpecialConversion: Option[String] = if (s == specialValue) None else Some(s)
}
}
特性工作正常,但问题在于它不是静态的,因此会创建多个StringConversions
,这是不希望的。 因此,我尝试扩展无法对特征进行的AnyVal
,因为Another limitation that is a result of supporting only one parameter to a class is that a value class must be top-level or a member of a statically accessible object.
尝试2:使用单例:
object ConversionUtils {
// Need an overridable value
lazy val specialValue = ","
implicit class StringConversions(val s: String) extends AnyVal {
def doSpecialConversion: Option[String] = if (s == specialValue) None else Some(s)
}
}
问题 :如何提供实用程序以能够覆盖StringConversions的specialValue并使其真正静态?
您可以要求一个隐式参数:
object ConversionUtils {
case class SpecialValue(str: String)
implicit class StringConversions(val s: String) extends AnyVal {
def doSpecialConversion(implicit sv: SpecialValue): Option[String] = if (s == sv.str) None else Some(s)
}
}
用法:
scala> implicit val sp = SpecialValue(",")
sp: ConversionUtils.SpecialValue = SpecialValue(,)
scala> "aaa".doSpecialConversion
res0: Option[String] = Some(aaa)
scala> ",".doSpecialConversion
res1: Option[String] = None
在一般情况下,像机械师这样的大型图书馆可能有助于摆脱样板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.