带有泛型返回类型的可选函数参数

Jer*_*iho 2 types scala

你将如何实现通过正则表达式解析一些输入并将创建的字符串转换为其他类型的类?我的方法是:

class ARegex[T](regex:Regex, reform:Option[String => T]){
  def findFirst(input:String):Option[T] = {
    (regex.findFirstIn(input), reform) match{
      case (None, _) => None
      case (Some(s), None) => Some(s) // this won't compile because of type mismatch
      case (Some(s), Some(fun)) => Some(fun(s))
    }
  }
}

class BRegex[T](regex:Regex, reform:Option[String => T]) {
  def findFirst(input:String) = {  //returns Option[Any] - erasure
    (regex.findFirstIn(input), reform) match{
      case (None, _) => None
      case (Some(s), None) => Some(s)
      case (Some(s), Some(fun)) => Some(fun(s))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*oom 7

我们可以通过消除Option部分reform类型来解决这个问题,并使用不同的机制来指示我们不想以任何方式更改匹配.identity当您不希望更改类型时,此机制将用作默认参数或传递标识.

class ARegex[T](regex:Regex, reform:String => T = identity[String](_)){
  def findFirst(input:String):Option[T] = {
    regex.findFirstIn(input) match{
      case None => None
      case Some(s) => Some(reform(s))
    }
  }
}

new ARegex("something".r).findFirst("something else") //returns Option[String]
new ARegex("3".r, {x=>x.toInt}).findFirst("number 3") //returns Option[Int]
Run Code Online (Sandbox Code Playgroud)