【问题标题】:Anonymous function in Scala, error depending on notationScala中的匿名函数,错误取决于符号
【发布时间】:2016-03-08 19:14:30
【问题描述】:

我正在尝试区分两个数组。具体来说,我有一个带有一些字符串的数组,另一个带有我想从第一个数组中清除的索引。起初我尝试使用带有“_”的匿名函数注释,但它不起作用,我很难理解为什么。 这是一个例子:

val a1 = Array("word1","word2","word3")
val ind = Array(1,2)
val a2 = a1.zip(a1.indices)

val not_working = a2.filterNot( ind.contains(_._2) )

> console>:15: error: missing parameter type for expanded function
> ((x$1) => x$1._2)
>         a2.filterNot( ind.contains(_._2) )
>                                    ^ <console>:15: error: type mismatch; 
> found   : Boolean  required: ((String, Int)) => Boolean
>         a2.filterNot( ind.contains(_._2) )

我的假设是 _ 对应于例如 ("word1",0) 或 ("word2",1) 元组。但我不明白错误,为什么它在这里得到布尔类型?我虽然它会得到元组的第二部分。

为了它,我尝试更明确地重写它,并且它起作用了。这是一个符合我期望的示例,在我天真的眼里,我唯一改变的就是符号:

val working = a2.filterNot( x => ind.contains(x._2) )

我很难理解两个示例之间的区别。为什么第二个有效?

【问题讨论】:

    标签: scala anonymous-function


    【解决方案1】:

    有两个错误叠加在一起:

    val not_working = a2.filterNot( ind.contains(_._2) )
    

    第一个错误是missing parameter type for expanded function。本质上,_ 语法不能在任何地方使用,这就是其中一种情况。 (在这种情况下,这是因为不能在嵌套括号中使用占位符语法。

    第二个错误是编译器不理解您尝试使用占位符语法的结果,但它仍然知道ind.contains 返回一个布尔值。这在错误消息中指出:found: Boolean。编译器认为一个布尔值被传递给filterNot,但filterNot 需要一个函数T =&gt; Boolean

    一旦语法问题得到解决,编译器就会正确解析表达式并编译您的示例。

    【讨论】:

      【解决方案2】:

      正如它提到的herehere 以及其他多个地方

      匿名函数的占位符语法替换了最小的 可能包含带有函数的表达式。

      所以

      a2.filterNot( ind.contains(_._2) )
      

      将被脱糖为

      a2.filterNot( ind.contains(x => x._2) )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多