【发布时间】:2017-09-19 21:27:30
【问题描述】:
我有一段非常简单的代码,我无法掌握。我正在阅读函数文字和方法。我在 repl 中这样做。
scala> val v = (a:Int, b:Int, c:Int) => {a+b+c}
v: (Int, Int, Int) => Int = $$Lambda$1368/1731643198@4ae730ca
scala> val v1 = v(1,2,_:Int)
v1: Int => Int = $$Lambda$1369/903167315@93d6f4
scala> v1 (10)
res29: Int = 13
scala>
scala> val v2 = v _
v2: () => (Int, Int, Int) => Int = $$Lambda$1370/5485285@7dd5d17a
scala> val v3 = v2()
v3: (Int, Int, Int) => Int = $$Lambda$1368/1731643198@4ae730ca
scala> val v4 = v3(1,2,3)
v4: Int = 6
scala> def sumMe(a:Int, b:Int, c:Int) = { a+b+c}
sumMe: (a: Int, b: Int, c: Int)Int
scala> val v7 = sumMe _
v7: (Int, Int, Int) => Int = $$Lambda$1371/906350712@6c86938f
scala> v7(1,2,3)
res30: Int = 6
我需要一些帮助来理解上面发生的事情。我将从代码的底部开始。当我创建方法 sumMe 并将其分配给右侧带有“_”的“v7”时,我知道我没有执行该方法。 val v7= sumMe_ 的输出对我来说很清楚,因为它只是告诉我 v7 将采用 3 个参数,并返回一个 int。目前感觉还可以。
现在当我转到我的 `val v1 = v(1,2,_:Int) 时,我仍然可以关联到它将创建一个函数对象并分配给 v1,实际上我使用的是 Scala s Function1 的 apply 方法是我的看法。
我希望到目前为止我理解它。如果我上面的理解是正确的,那么引起最大困惑的是val v2 = v _。根据我所看到的输出,我必须以不同的方式称呼这个东西。基本上我无法理解为什么 v2 与 v7 不同。 v2 不接受任何参数,并给了我一个可以调用的函数。如果我定义为val v = ... 的那种函数文字总是如此,那么当我执行val v1 = v(1,2,:_Int) 时,为什么不从类似于v2's case 的scala v1:()=>Int=>Int 得到它。
最后,为什么v7=sumMe _ 不能给我与val v2 = v_ 相同的输出
【问题讨论】:
标签: scala functional-programming