我通过以下一些示例来学习specs2
测试框架。
我注意到以下匿名函数语法重复出现:
val upper = (_: String).toUpperCase
相当于更传统/通常的
val upper = (s: String) => s.toUpperCase
虽然语法简单且优雅,但它不是familiar (easy)。
有人可以引导我了解第一种语法是如何工作/派生的吗?我非常确定它与某种部分应用程序有关,但无法完全解释。
Scala
中经常使用的语法是什么? (我还在这里学习绳索:])
编辑::
我发现使用这种语法的重复模式是ad-hoc多态(简单地说,是重载的方法/函数),其中传递函数的参数类型决定调度哪个函数。
例如,
def f(g: Int => String): String = g(10)
def f(g: String => String): String = g("hello")
f((_: Int).toString + " beers") // 10 beers
f((_: String) + " world") // hello world
这种模式在ScalaCheck
等库中反复出现。
答案 0 :(得分:2)
语法表示编译器正在创建一个类型为String
的参数的函数,该函数根据参数顺序插入到使用_
的位置。如果你有:
val f = (_:String).length + (_:Int)
它将创建一个函数(String, Int) => Int
,其中每个_
标记参数的使用位置。订单很重要!必须按照希望函数参数的顺序使用它们
如果在声明val
时已经定义了类型,则可以在函数体中省略它们:
val f: (String, Int) => Int = _.length + _