在网上看了一些例子后,我意识到只有一个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))
为什么这种行为有所不同?
答案 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)
。