scala方法调用技巧列表(1,2,3).foldLeft(0)+_
我来自美国,所以我仍然不清楚scala方法调用的语法技巧。我认为lcn在链接中的答案是明确的,但这意味着什么:scala方法调用技巧列表(1,2,3).foldLeft(0)+_,scala,Scala,我来自美国,所以我仍然不清楚scala方法调用的语法技巧。我认为lcn在链接中的答案是明确的,但这意味着什么: val r = List(1, 2, 3).foldLeft(0) _+_ //r: String => String = $Lambda$1642/1200068083@562c1af9 val l = r{"hello"} //l: String = $Lambda$1643/1458648440@23ae6386hello 为什么r是一个函数?并调用它返回另一个函数l,并
val r = List(1, 2, 3).foldLeft(0) _+_ //r: String => String = $Lambda$1642/1200068083@562c1af9
val l = r{"hello"} //l: String = $Lambda$1643/1458648440@23ae6386hello
r
是一个函数?并调用它返回另一个函数l
,并且不能调用l
这与运算符优先级有关:
val r = List(1, 2, 3).foldLeft(0) _+_
相当于:
val r = (List(1, 2, 3).foldLeft(0) _) + _
这意味着-我们使用部分应用的foldLeft
函数,列表(1,2,3)。foldLeft(0)
,它的类型为((Int,Int)=>Int)=>Int)
,我们在其上调用+
现在-Scala编译器试图找出+
运算符对函数的含义,并且由于函数
没有定义这样的运算符,因此它尽其所能找到合适的隐式转换,并发现实际上,函数
可以使用其toString
方法转换为字符串
,因此+
意味着“一个新的匿名函数,它将传递的任何输入字符串附加到列表(1,2,3).foldLeft(0)
函数的字符串表示中”
因此,我们最终得到了一个String=>String
函数,它将输入附加到函数列表(1,2,3)的toString
结果中。foldLeft(0)
,即”
:
scala>val r=List(1,2,3).foldLeft(0)+_
r:String=>String=
scala>r(“a”)
res5:String=a
scala>r(“bbbb”)
res6:String=bbbb
这与运算符优先级有关:
val r = List(1, 2, 3).foldLeft(0) _+_
相当于:
val r = (List(1, 2, 3).foldLeft(0) _) + _
这意味着-我们使用部分应用的foldLeft
函数,列表(1,2,3)。foldLeft(0)
,它的类型为((Int,Int)=>Int)=>Int)
,我们在其上调用+
现在-Scala编译器试图找出+
运算符对函数的含义,并且由于函数
没有定义这样的运算符,因此它尽其所能找到合适的隐式转换,并发现实际上,函数
可以使用其toString
方法转换为字符串
,因此+
意味着“一个新的匿名函数,它将传递的任何输入字符串附加到列表(1,2,3).foldLeft(0)
函数的字符串表示中”
因此,我们最终得到了一个String=>String
函数,它将输入附加到函数列表(1,2,3)的toString
结果中。foldLeft(0)
,即”
:
scala>val r=List(1,2,3).foldLeft(0)+_
r:String=>String=
scala>r(“a”)
res5:String=a
scala>r(“bbbb”)
res6:String=bbbb
这样写完全是一种误导。至少.foldLeft(0)\+
并不表示\
和\
在某种程度上属于同一类。链接的答案没有试图通过删除\uu+\uu
中的所有空格来产生任何视觉错觉。这完全是一种误导性的记录方式。至少.foldLeft(0)\+
并不表示\
和\
在某种程度上属于同一类。链接的答案没有试图通过删除\u+\ ucode>中的所有空格来产生任何视觉错觉。一个小错误:隐式转换不是执行到String
,而是执行到scala.runtime.StringAdd
,一个只有一个方法def+(其他:String)的类
一个小错误:隐式转换不是执行到String
,而是执行到scala.runtime.StringAdd
,该类只有一个方法def+(其他:String)