我有一段非常簡單的代碼,我無法掌握。我正在閱讀函數文字和方法。我正在做這個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我刪除了該部分,因爲似乎存在與聲明範圍有關的問題。你可以在一個類的成員上做到這一點,但不是在一個方法聲明中,我正在研究確切的規則,但他們對於答案並不重要。 –