我刚刚在 play2-auth 示例中偶然发现了这一行:
val remember = request.tags.get("rememberme").exists("true" ==) || //...
我明白它的作用(检查 map 标签是否包含映射 "rememberme"-> "true"
),但是我在 exists()
中找到了谓词很有趣,从来没有见过这样写的。
在 REPL 中稍微测试了一下之后,我得出的结论是它与
具有相同的含义.exists("true" == _)
// or even longer:
.exists(s => "true" == s)
这个符号显然也适用于其他单参数函数,而不仅仅是谓词:
scala> Some("world").map("Hello " +)
res0: Option[String] = Some(Hello world)
为什么这里的参数可以省略呢?最终它似乎保存了一个字符,即下划线。仅仅为此引入语言特性对我来说似乎有点奇怪。是否有一些与此相关的更大的图景?
最佳答案
它可以省略,因为方法会自动转换为函数。可以说只会对对象上的方法或导入范围的方法执行此操作,因此您不需要指定它们所在的对象。但更一致的说法是:如果你命名一个方法,并且调用一个函数,编译器会为你转换它。
因此,"Hello ".+
命名了一个方法(从技术上讲,$plus
扩展方法来自 StringOps
)。因此它被转换为一个函数。
至于为什么完全允许自动转换而不是总是需要 _
,嗯,这更主观。如果您使用的是更实用的样式,那么您会经常使用它,所以当您非常清楚自己的意思时,最好不要让多余的 _
乱扔垃圾(例如 xs .foreach(println)
).
关于scala - 为什么这个谓词中的参数可以省略呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833180/