scala - lambda 表达式中的奇怪语法

标签 scala

val (xa, xb) = xs partition ( a > )

什么是a >在上面的代码中,它与 a > _ 有何不同? ? (假设 a 是一些预定义的值)

最佳答案

任何需要带有某个参数的函数的方法都可以改为传递一个单参数方法,如果类型成功,该方法将自动转换。

所以这些都是有效的:

class C { def go(i: Int) = -i }
val c = new C
List(1,2,3).foreach( println )
List(1,2,3).map( c go )

因此,要么 a 定义了方法 >,要么可以使用 > 方法隐式转换为某种东西。例如,这有效:
List(1,2,3).partition(2 >)

因为(编辑:有人会认为这是真的....)存在从 IntRichInt 的隐式转换(与给您 .toFloat 等相同的转换),并且 RichInt 定义了 > 方法。 partition 需要一个接受 Int 并返回 Boolean 的函数,而 2 > 是一个接受 Int 并返回 Boolean 的方法。所以转换会自动发生。

(编辑:但正如@Lukas Rytz 指出的那样,它甚至比这更棘手,因为编译器意识到它可以专门处理原始整数,所以即使 > 并不是对象 2 上的真正方法,因为 2 不是对象,并且原语没有方法,编译器认识到推迟到 RichInt 会更慢。所以,事实上,它只是用正确的字节码编写了一个方法。)

只有当正确的转换没有自动发生时(例如,由于歧义,或者因为您想将其分配给变量),您才需要使用 _ 从方法中创建函数。 (然后并不总是很清楚您是使用 _ 将方法转换为函数,还是使用 _ 作为输入的占位符;幸运的是,两种方式的结果都是相同的。)

关于scala - lambda 表达式中的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754971/

相关文章:

Scala:返回 bool 值的模式匹配的缩写形式

scala - 如何在 ScalaTest 中使测试失败并打印堆栈跟踪?

scala - 解码的Snappy压缩字节数组的结尾为零

java - 如何序列化 Scala 中的函数?

scala - 如何在 Controller 中进行单元测试?

scala - 创建 Map 为每个 List 元素保留 # of appearance

scala - 是否有一个类似于TestNg的scalaTest机制DependOnMethods批注

scala - N-Tuple of Options to Option of N-Tuple

scala - 验证带有复选框元组的映射表单

scala - 无法在 Scala 中使用 Mockito ArgumentMatchers