val (xa, xb) = xs partition ( a > )
上述代码中的a >
是什么?它与a > _
有什么不同? (假设a
是某个预定义的值)
答案 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 >)
因为(编辑:一个人认为这将是真的......)有从Int
到RichInt
的隐式转换(同一个给你的.toFloat
等),RichInt
定义了>
方法。 partition
要求使用Int
并返回Boolean
和2 >
的函数是一种采用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)
我认为它实际上完全一样。