2016-03-03 41 views
1

我正在尝试编写一些字符串实用程序,以便能够隐式转换表单"myString".doSpecialConversion并基于doSpecialConversion工作的specialValueScala隐式字符串转换实用程序

尝试-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并且是真正静态的?

回答

1

你可以要求一个隐含的参数:

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 

在一般的情况下,宏观的库,例如machinist可能有助于摆脱样板。