0
scala> val set = Set("apricot", "banana", "clementine", "durian", "fig", "guava", "jackfruit", "kiwi", "lime", "mango")
set: scala.collection.immutable.Set[java.lang.String] = Set(banana, durian, fig, jackfruit, lime, mango, clementine, apricot, kiwi, guava)

scala> set.partition(_ length > 5)
<console>:1: error: ')' expected but integer literal found.
       set.partition(_ length > 5)
                                ^

scala> set.partition(_.length > 5)
res5: (scala.collection.immutable.Set[java.lang.String], scala.collection.immutable.Set[java.lang.String]) = (Set(banana, durian, jackfruit, clementine, apricot),Set(fig, lime, mango, kiwi, guava))

有人可以解释为什么我执行时它会抱怨吗

set.partition(_ length > 5)

而不是当我执行

set.partition(_.length > 5)

我也尝试了以下方法,但收效甚微:

scala> set.partition((_ length) > 5)
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.length)
              set.partition((_ length) > 5)
                             ^
4

2 回答 2

4

当您放下点时,Scala 假定您有一个单参数方法。换句话说,当你说它_ length > 5认为这length是一种需要一个参数的方法时,那>就是那个参数,然后它不知道如何处理 5。

请注意,这与您编写5 + 5. 此语句与 writing 相同5.+(5),但您删除了点和括号。Scala 注意到丢失的点并假设(正确地)这+是一个需要单个参数的方法。

如果您自己编写"abc" length,那么 Scala 就没有任何东西可以假设是参数,因此它会意识到length不需要参数。

所以:

"abc".length        // fine
"abc" length        // fine
"abc".length > 4    // fine
("abc" length) > 4  // fine
"abc" length > 4    // error!

因此,您需要一个点或括号来告诉编译器"abc"并且length一起使用并且没有额外的参数。

就编码风格而言,我建议您始终将点用于零参数方法。我发现它更具可读性,它将帮助您避免诸如此类的编译错误。

于 2012-05-11T16:00:08.333 回答
3

当你写:

set.partition(_ length > 5)
//            ^ object
//              ^ method
//                     ^ parameter

它被视为length一种接收一个参数的方法,>.

当你写的时候:

set.partition(_.length > 5)
//            ^------^ object
//                     ^ method
//                       ^ parameter 

它被视为_.length对象,>是参数,5是参数。

于 2012-05-11T15:59:52.077 回答