gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:08:25 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com