【发布时间】:2016-11-17 18:55:43
【问题描述】:
有时我很难理解如何调用函数。我正在研究列表并正在编写其方法的示例。
andThen 定义如下
def andThen[C](k: (A) ⇒ C): PartialFunction[Int, C]
我知道我必须将函数文字传递给andThen。所以我创建了以下有效的代码。
scala> val l = List (1,2,3,4)
l: List[Int] = List(1, 2, 3, 4)
//x:Int works
scala> val listAndThenExample = l.andThen((x:Int) => (x*2))
listAndThenExample: PartialFunction[Int,Int] = <function1>
//underscore works
scala> val listAndThenExample = l.andThen(_*2)
listAndThenExample: PartialFunction[Int,Int] = <function1>
由于列表是整数,所以 A 必须是 Int。 C 可以是任何东西,具体取决于函数字面量的输出。
上面说的有道理。
后来我尝试了applyOrElse。其签名如下
def applyOrElse[A1 <: Int, B1 >: A](x: A1, default: (A1) ⇒ B1): B1
从上面,我了解到 A1 可以是 Int 或其子类(上界),一些 B1 将是返回类型(取决于我在默认函数中所做的)。
如果我对 A1 和 B1 的理解是正确的,那么 x 将是 Int 或其子类,并且默认函数字面量应该采用 Int(或子类)并返回一些 B1。我尝试如下调用该函数,但当我使用y:Int 时它不起作用,但在我使用_:Int 时它起作用。我不明白为什么。
scala> val l = List (1,2,3,4)
l: List[Int] = List(1, 2, 3, 4)
//this doesn't work
cala> val listApplyOrElse = l.applyOrElse(y:Int,(x:Int)=>println("Wrong arg "+x))
<console>:12: error: not found: value y
val listApplyOrElse = l.applyOrElse(y:Int,(x:Int)=>println("Wrong arg "+x))
^
//but underscor works
scala> val listApplyOrElse = l.applyOrElse(_:Int,(x:Int)=>println("Wrong arg "+x))
listApplyOrElse: Int => AnyVal = <function1>
问题 - 为什么 x:Int 和 _:Int 都适用于 andThen 而不适用于 applyOrElse?
问题 - 什么是“A”,为什么 B1 与 A 相关?
【问题讨论】:
-
l.applyOrElse(_:Int,(x:Int)=>println("Wrong arg "+x))转换为(y: Int) => l.applyOrElse(y, (x:Int)=>println("Wrong arg "+x))
标签: scala