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



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

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(),这是编译器将插入的内容。有没有办法在不手动脱糖的情况下做到这一点?

是的,有几种可能的解决方案。 所有工作要么满足隐式参数列表,要么给编译器一个提示,即表达式已经结束,()read apply,实际上是应用方法,没有第二个参数列表。

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 作品。

最新更新