单个arg匿名函数(避免下划线)的简明表示法不能按预期工作

时间:2011-07-06 08:03:02

标签: scala

在网上看了一些例子后,我意识到只有一个arg时,有一种方法可以编写一个没有下划线的匿名函数。另外,我正在试验List上的“span”方法,我从来不知道它存在。无论如何,这是我的REPL会议:

scala> val nums = List(1, 2, 3, 4, 5)
nums: List[Int] = List(1, 2, 3, 4, 5)

scala> nums span (_ != 3)
res0: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 !=)
res1: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

到目前为止一切顺利。但是当我尝试使用“小于”运算符时:

scala> nums span (_ < 3)
res2: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 <)
res3: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

为什么这种行为有所不同?

3 个答案:

答案 0 :(得分:10)

scala> nums span (_ < 3)
res0: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 >)
res1: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

3 <3 < _的快捷方式,可以通过方法调用创建部分应用的函数。

答案 1 :(得分:3)

表现正常:

scala> nums span (3 < _)
res4: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

对于列表的第一个元素,谓词为false,因此span返回的第一个列表为空。

答案 2 :(得分:1)

scala> nums span (3 < _) 
res0: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))
// is equivalent to 
scala> (nums takeWhile{3 < _}, nums.dropWhile{3 < _}) 
res1: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

,其中 谓词对于第一个元素(1)已经为假,因此nums.takeWhile{false}会导致空列表List()

对于第二部分,没有任何内容被删除,因为谓词对于第一部分已经是假的 element(1)因此nums.dropWhile{false}是整个列表List(1, 2, 3, 4, 5)