scala - 为什么这个谓词中的参数可以省略呢?

标签 scala function parameters

我刚刚在 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/

相关文章:

scala - 电梯导入 net.liftweb 返回错误 "not found: value net"

mysql - 使用 MySQL 在 Slick 3 中做主/从的最佳方法

javascript - 在 node.js 中使用命名参数

c++ - 重载运算符 * C++

php - 字符串到数组返回参数中的数组

Java 泛型 : multiple generic parameters?

scala - 无法在 IntelliJ 中运行 Scala 应用程序

c - 在参数中带有字符串的函数

sql - 是否有数组的 SQL 参数绑定(bind)?

mongodb - Mongo Scala Play - java.lang.NoSuchMethodError : com. mongodb.ConnectionString.getApplicationName()Ljava/lang/String;]