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 >)
因为(编辑:有人会认为这是真的....)存在从
Int
到 RichInt
的隐式转换(与给您 .toFloat
等相同的转换),并且 RichInt
定义了 >
方法。 partition
需要一个接受 Int
并返回 Boolean
的函数,而 2 >
是一个接受 Int
并返回 Boolean
的方法。所以转换会自动发生。(编辑:但正如@Lukas Rytz 指出的那样,它甚至比这更棘手,因为编译器意识到它可以专门处理原始整数,所以即使
>
并不是对象 2
上的真正方法,因为 2
不是对象,并且原语没有方法,编译器认识到推迟到 RichInt
会更慢。所以,事实上,它只是用正确的字节码编写了一个方法。)只有当正确的转换没有自动发生时(例如,由于歧义,或者因为您想将其分配给变量),您才需要使用
_
从方法中创建函数。 (然后并不总是很清楚您是使用 _
将方法转换为函数,还是使用 _
作为输入的占位符;幸运的是,两种方式的结果都是相同的。)
关于scala - lambda 表达式中的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754971/