我有一段非常简单的代码,我无法掌握。我正在阅读函数文字和方法。我正在做这个repl。scala函数字面值和方法和下划线
scala> val v = (a:Int, b:Int, c:Int) => {a+b+c}
v: (Int, Int, Int) => Int = $$Lambda$1368/[email protected]
scala> val v1 = v(1,2,_:Int)
v1: Int => Int = $$Lambda$1369/[email protected]
scala> v1 (10)
res29: Int = 13
scala>
scala> val v2 = v _
v2:() => (Int, Int, Int) => Int = $$Lambda$1370/[email protected]
scala> val v3 = v2()
v3: (Int, Int, Int) => Int = $$Lambda$1368/[email protected]
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/[email protected]
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's应用方法就是我所看到的。
我希望我理解它到目前为止。如果我上面的理解是正确的,那么造成最多混淆的是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_
嗨Yuval,你的解释有帮助。一旦我一遍又一遍地阅读你的帖子,我会回来再问你一些。你可以在此期间尝试多解释一下你的答案的结尾是什么意思 - 请注意后者是一个特殊的... 你是说我的代码中有一个编译错误? – curiousengineer
@curiousengineer我删除了该部分,因为似乎存在与声明范围有关的问题。你可以在一个类的成员上做到这一点,但不是在一个方法声明中,我正在研究确切的规则,但他们对于答案并不重要。 –