第二次实施有什么问题?
作品:
scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i }
res1: List[Int] = List(2)
Run Code Online (Sandbox Code Playgroud)
不:
scala> val evens = PartialFunction[Any, Int]{
| case i: Int if i % 2 == 0 => i
| }
evens: PartialFunction[Any,Int] = <function1>
scala> List(1,2,3).collect{evens}
scala.MatchError: 1 (of class java.lang.Integer)
at $anonfun$1.apply(<console>:7)
at $anonfun$1.apply(<console>:7)
at scala.PartialFunction$$anonfun$apply$1.applyOrElse(PartialFunction.scala:242)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
at scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
at scala.collection.immutable.List.foreach(List.scala:318)
...
Run Code Online (Sandbox Code Playgroud)
你应该这样创建evens PartialFunction:
val evens: PartialFunction[Any, Int] = {
case i: Int if i % 2 == 0 => i
}
Run Code Online (Sandbox Code Playgroud)
随着PartialFunction[Any, Int]{ ... }你调用一个apply对象的方法PartialFunction.它定义如下:
def apply[A, B](f: (A) ? B): PartialFunction[A, B]
Run Code Online (Sandbox Code Playgroud)
所以{ case i: Int if i % 2 == 0 => i }用作函数,而不是a PartialFunction和evens任何参数定义:
scala> val evens = PartialFunction[Any, Int]{
| case i: Int if i % 2 == 0 => i
| }
scala> evens.isDefinedAt(1)
res1: Boolean = true
scala> val evens: PartialFunction[Any, Int] = {
| case i: Int if i % 2 == 0 => i
| }
scala> evens.isDefinedAt(1)
res5: Boolean = false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |