lambda表达式中的奇怪语法

时间:2010-09-20 19:51:54

标签: scala

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

上述代码中的a >是什么?它与a > _有什么不同? (假设a是某个预定义的值)

3 个答案:

答案 0 :(得分:11)

任何期望具有某个参数的函数的方法都可以通过单参数方法传递,如果类型有效,则该方法将自动转换。

所以这些都是有效的:

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并返回Boolean2 >的函数是一种采用Int并返回Boolean的方法。因此转换会自动发生。

(编辑:但正如@Lukas Rytz指出的那样,它比这更棘手,因为编译器意识到它可以特别处理原始的int,所以即使>实际上并不是对象上的方法{ {1}},因为2不是一个对象,并且原语没有方法,编译器会认识到延迟到2会慢一点。所以,事实上,它只是用一个方法写一个方法正确的字节码。)

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

答案 1 :(得分:2)

根本没有什么不同,它只是一个较短的版本。

scala> val a = 10
a: Int = 10

scala> val xs = List(1, 2, 3, 4, 5, 11, 12, 13, 14, 15)
xs: List[Int] = List(1, 2, 3, 4, 5, 11, 12, 13, 14, 15)

scala> val (xa, xb) = xs partition ( a > )
xa: List[Int] = List(1, 2, 3, 4, 5)
xb: List[Int] = List(11, 12, 13, 14, 15)

答案 2 :(得分:1)

我认为它实际上完全一样。