为什么可以省略此谓词中的参数?

时间:2016-03-06 22:04:48

标签: scala function parameters

我在play2-auth示例中偶然发现了这一行:

val remember = request.tags.get("rememberme").exists("true" ==) || //...

我理解它的作用(检查地图标签是否包含映射"rememberme" -> "true"),但我发现exists()中的谓词很有趣,并且从未见过以这种方式编写的谓词。

在REPL中测试了一下后,我得出的结论是它与

具有相同的含义
.exists("true" == _)
// or even longer:
.exists(s => "true" == s)

这种表示法显然也适用于其他单个参数函数,而不仅仅是谓词:

scala> Some("world").map("Hello " +)
res0: Option[String] = Some(Hello world)

为什么这里的参数可以省略?最终它似乎拯救了一个角色,下划线。对我来说,为此引入语言功能似乎有点奇怪。是否有一些与此相关的更大图片?

1 个答案:

答案 0 :(得分:2)

可以省略它,因为方法会自动转换为函数。可以说,人们只会对物体上的方法或导入范围的方法这样做,因此您不需要指定他们所依赖的对象。但是它更加一致只是说:如果你命名一个方法,并且需要一个函数,编译器会为你转换它。

因此,unsigned long ns_time; struct timespec ts; getnstimeofday(&ts); ns_time = 1000000000 * ts.tv_sec + ts.tv_nsec; 为方法命名(从技术上讲,"Hello ".+的{​​{1}}扩展方法)。因此它会转换为函数。

至于为什么允许自动转换而不是总是需要$plus,那么,这更主观。如果您正在使用更具功能性的风格,那么您可以使用它,所以当您非常清楚自己的意思时,不要让多余的StringOps乱扔垃圾,这样做很好(例如{ {1}})。