Optional function parameter with generic return type
你将如何实现通过正则表达式解析一些输入并将建立的字符串转换为其他类型的类?我的做法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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)) } } } |
我们可以通过消除
1 2 3 4 5 6 7 8 9 10 11 | 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] |
好吧,问题在于类型不匹配,因为您返回的是
除此之外,该代码的简化版本如下:
1 2 3 4 |
不过,你可以返回一个
1 2 3 4 |
为什么要改革 Option[String => T] 而不是 String => T?如果您没有传入用于创建所需类型的实例的机制,则运行时系统没有任何机制可以实际创建适当的对象。如果你真的需要传入一个 Option[String => T] 那么你的第二种情况应该简单地返回 None.
另外,flatMap 是你的朋友,它会给你正确的行为(即如果reform 是None,该方法返回None。
1 2 3 |