Scala隐式字符串转换实用程序
我正在尝试编写一些字符串util,以便能够进行Scala隐式字符串转换实用程序,scala,Scala,我正在尝试编写一些字符串util,以便能够进行“myString”.doSpecialConversion形式的隐式转换,并有一个特殊值,doSpecialConversion的工作基础 尝试1:使用特征: trait ConversionUtils { // Need an overridable value
“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
一般情况下,宏库(如)可能有助于摆脱样板文件