是否有理由对不属于偏的函数使用PartialFunction
?
scala> val foo: PartialFunction[Int, Int] = {
| case x => x * 2
| }
foo: PartialFunction[Int,Int] = <function1>
foo
被定义为PartialFunction
,但当然case x
会捕获所有输入。
这是不好的代码,因为PartialFunction
类型向程序员表明某些输入的函数未定义?
答案 0 :(得分:4)
问题是,有很多例子表明你需要在特征/对象/函数定义上定义的是PartialFunction
,但实际上真正的实现可能不是一个。举个例子,看看def collect[B](f: PartialFunction[A,B])
:
val myList = thatList collect {
case Right(value) => value
case Left(other) => other.toInt
}
它显然不是“真实的”部分,因为它是为所有输入定义的。也就是说,如果我愿意,我可以进行Right
匹配。
但是,如果我将collect
写成一个完整的普通函数,那么我就会错过所期望的行为(即filter
和{{1}在定义函数时将其置于一个基础上。)这是一个很好的行为,并且在编写自己的代码时可以提供很大的灵活性。
所以我想更好的问题是,您是否希望行为反映出函数可能无法在任何地方定义?如果答案是否定的,则不要这样做。
答案 1 :(得分:4)
使用PartialFunction
代替Function
没有任何优势,但如果您必须传递PartialFunction
,则必须传递PartialFunction
。< / p>
请注意,由于这两者之间的继承,重载方法以接受这两者会导致难以使用的东西,因为类型推断将无法工作。
答案 2 :(得分:3)
PartialFunction
文字允许直接在参数上进行模式匹配(例如{ case (a, b) => ... }
而不是_ match { case (a, b) => ... }
),这使代码更具可读性(请参阅@wheaties的答案另一个例子)。