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