繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM