在匹配情况下是否可以使用隐式函数?

时间:2018-07-18 16:06:05

标签: scala implicit

我有这样的枚举。

  object SortCountryField extends Enumeration {
    type SortCountryField = Value
    val countryName = Value("country_name")
    val countryStatus = Value("country_status")
  }

我正在SortCountryField中使用这个match-case枚举。 在这里,我每次都需要转换toString。

为了方便起见,我正在尝试implicit转换器从String提取SortCountryField.{Value}

但是,在以下情况下使用隐式函数时,最终出现编译器错误。

'myString' match{
    case SortCountryField.countryName.toString => //Some operations
    case SortCountryField.countryStatus.toString => //another operation
}

错误日志:-

 found   : mypackage.ConstantUtils.SortCountryField.Value
[error]  required: String
[error]         case SortCountryField.countryStatus => //my-operations

4 个答案:

答案 0 :(得分:2)

我认为最好在比赛中使用枚举:

SortCountryField withName <your_string> match {
    case SortCountryField.countryName => //Some operations
    case SortCountryField.countryStatus => //another operation
}

如果您的字符串有时不匹配任何字段,则可以轻松地将其包装在Try中,如以下代码所示:

Try(SortCountryField withName <your_string>) match {
    case Success(SortCountryField.countryName) => //Some operations
    case Success(SortCountryField.countryStatus) => //another operation
    case _ => //another operation
}

答案 1 :(得分:0)

您也可以这样做:

'myString' match{
   case x if x == SortCountryField.countryName.toString => //Some operations
   case x if x == SortCountryField.countryStatus.toString => //another operation
}

答案 2 :(得分:0)

您的隐式转换器的外观如何? 我的猜测是您有转换器SortCountryField => String,但您需要SortCountryField.Value => String转换器。

答案 3 :(得分:0)

在枚举中添加以下功能:

implicit def toString(value: Value): String = value.toString

在匹配中使用以下内容:

val countryStaus:String = SortCountryField.countryStatus

'myString' match {
    case `countryStatus` => //Some operations
    case _ => // Another operation
}