2016-03-03 40 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可能有助於擺脫樣板。