参数是什么" _"在下面的方法调用中表示?
这是一个接受任何类型参数的通配符吗?
val integerSorter = msort[Int]((a, b) => a < b) _
方法msort签名:
def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = {
答案 0 :(得分:10)
最简单的解释方法可能是让编译器完成大部分解释 - 只需尝试没有下划线的第一行:
scala> val integerSorter = msort[Int]((a, b) => a < b)
<console>:11: error: missing arguments for method msort;
follow this method with `_' if you want to treat it as a partially applied function
val integerSorter = msort[Int]((a, b) => a < b)
^
所以你有它 - msort
方法有两个参数列表,但你只传递了第一个的参数,而尾随下划线是Scala提供的语法,告诉编译器你想要部分适用于那种情况。
(如果您在REPL 中使用下划线尝试该行,您会看到integerSorter
的推断类型为List[Int] => List[Int]
,以便回答您的第二个问题,不,下划线不允许您提供任何类型的参数。)
有关详细信息,请参阅the language specification的第6.7节:
如果
e _
属于方法类型或e
是一个e
,则表达式e
格式正确 按名称调用参数。如果e _
是带参数的方法,e
表示通过eta扩展将{{1}}转换为函数类型 (§6.26.5)。
阅读有关eta扩展的部分也可能有所帮助。
答案 1 :(得分:2)
msort接受两个参数,一个返回布尔值的函数,以及一个要排序的项列表。函数integerSorter提供第一个参数,下划线表示仍需要指定的列表。查看currying(http://www.scala-lang.org/old/node/135.html)以获得更详细的解释。