aio*_*obe 53 scala partialfunction
在我看来{ case ... => ... }
,部分函数的语法至少需要一个case
:
scala> val pf: PartialFunction[String, String] = { case "a" => "b" }
pf: PartialFunction[String,String] = <function1>
scala> val pf: PartialFunction[String, String] = { }
<console>:5: error: type mismatch;
found : Unit
required: PartialFunction[String,String]
val pf: PartialFunction[String, String] = { }
^
Run Code Online (Sandbox Code Playgroud)
那么,定义"空"部分函数的最佳方法是什么?难道还有比"手动"覆盖更好的办法isDefinedAt
和apply
?
mpi*_*ist 55
Map是PartialFunction,所以你可以这样做:
val undefined: PartialFunction[Any, Nothing] = Map.empty
Run Code Online (Sandbox Code Playgroud)
And*_*ejs 42
从Scala 2.10开始,您可以使用:
val emptyPf = PartialFunction.empty[String, String]
Run Code Online (Sandbox Code Playgroud)
scala> def pfEmpty[A, B] = new PartialFunction[A, B] {
| def apply(a: A): B = sys.error("Not supported")
| def isDefinedAt(a: A) = false
| }
pfEmpty: [A, B]=> java.lang.Object with PartialFunction[A,B]
scala> val f = pfEmpty[String, String]
f: java.lang.Object with PartialFunction[String,String] = <function1>
scala> f.lift
res26: (String) => Option[String] = <function1>
scala> res26("Hola")
res27: Option[String] = None
Run Code Online (Sandbox Code Playgroud)
正如@didierd在评论中所说,由于参数差异,单个实例可以涵盖所有可能的参数类型.
scala> object Undefined extends PartialFunction[Any, Nothing] {
| def isDefinedAt(a: Any) = false
| def apply(a: Any): Nothing = sys.error("undefined")
| }
defined module Undefined
scala> val f: PartialFunction[String, String] = Undefined
f: PartialFunction[String,String] = <function1>
scala> f.lift apply "Hola"
res29: Option[String] = None
Run Code Online (Sandbox Code Playgroud)
从每个人那里窃取,可能的混合:
val undefined : PartialFunction[Any, Nothing] = {case _ if false =>
sys.error("undefined")
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5685 次 |
最近记录: |