Scala运算符关联性(第2个参数列表)

时间:2016-06-28 18:08:45

标签: scala scala-collections

是否可以直接对采用第二个参数列表(带有隐式arg)的方法的结果调用apply函数?即使在逻辑位置使用括号,我也会得到相同的编译时类型错误,这表明它没有按预期解析它。

val x = Map(1 -> 2, 2->4, 3-> 6) //1

val y = x.map(_.swap) //2

y(4) //3

x.map(_.swap)(4) //4

((x.map(_.swap))(4) //5

第4行有意义不解析,因为(4)很容易看起来是map()的第二个参数列表,但是第5行,.map表达式周围有一组(),但它仍然是将(4)与.map相关联,而不是.map()的结果。

有没有办法在一个表达式中执行第2行和第3行?

编辑:我知道.apply(),这是编译器将自己插入的内容。有没有办法在没有人工去糖的情况下做到这一点?

1 个答案:

答案 0 :(得分:0)

是的,有几种可能的解决方案。 所有工作都可以通过满足隐式参数列表或给编译器提示表达式已经结束而(),read apply,实际上是apply-method而没有第二个参数列表。

1。致电.apply()

scala> Map(1 -> 2, 2 -> 4, 3 -> 6).map(_.swap).apply(4)
res7: Int = 2

2。直接提供隐式

另一个选择是直接提供隐式

突破的示例

import scala.collection.breakOut

scala> List(1).map(_ + 1)(breakOut)(0)
res38: Int = 2

我认为一般问题是:您必须填写以提供隐含的CanBuildFrom才能正常工作或明确声明您要调用apply而不填充第二个参数列表。

您可以在http://docs.scala-lang.org/tutorials/FAQ/breakout中找到更多信息。与secCanBuildFrom的名称相反。