Scala隐式字符串转换实用程序

Scala隐式字符串转换实用程序,scala,Scala,我正在尝试编写一些字符串util,以便能够进行“myString”.doSpecialConversion形式的隐式转换,并有一个特殊值,doSpecialConversion的工作基础 尝试1:使用特征: trait ConversionUtils { // Need an overridable value

我正在尝试编写一些字符串util,以便能够进行
“myString”.doSpecialConversion
形式的隐式转换,并有一个
特殊值
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)
  }
}
Trait工作正常,但问题是它不是静态的,因此会创建多个
stringconversion
,这是不需要的。所以我尝试扩展
AnyVal
,这对于一个特征来说是不可能的,因为

尝试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)
  }
}

问题:我如何提供一个Util来覆盖StringConversion的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
一般情况下,宏库(如)可能有助于摆脱样板文件