二元组表达式除了标准的小括号表达方式:("a","b")
还可以有箭头表达式:"a"->"b"
,看看背后是怎么被翻译的:
在 Predef里定义了从类型A隐式转换到 ArrowAssoc 的方法:
@deprecated("use `ArrowAssoc`", "2.11.0") def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)
在使用scala2.12时这个方法已经废弃,而是使用隐式类 看看 ArrowAssoc 这个类:
/** @group implicit-classes-any */
implicit final class ArrowAssoc[A](private val self: A) extends AnyVal {
@inline def -> [B](y: B): Tuple2[A, B] = Tuple2(self, y)
def →[B](y: B): Tuple2[A, B] = ->(y)
}
定义了 ->
以及Unicode字符的→
方法,实现上是创建了 Tuple2。
性能考量的2点:
1) ArrowAssoc是值类型,运行时虽有隐式转换,但避免了在堆上分配一个包装对象
2) ->方法是声明为@inline的,也提升了性能