3

重複の可能性:
List.filter のアンダースコア

これは機能します(意図したとおり):

List(true, false, true).filter(_ == true).foreach(println)

しかし、私はこのように書くことはできません:

List(true, false, true).filter(_).foreach(println)

なんで?

4

2 に答える 2

9

@sshaefは正しいです、これは重複しています。ただし、リンクされた回答は非常に冗長であるため、簡単な回答を次に示します。

list.filter(_)のような展開が期待されますlist.filter(x=>x)が、Scala コンパイラは と同じように扱いますがlist.filter _、これはまったく異なります。結果はfilter、アイデンティティ関数でリストをフィルタリングするのではなく、リストに部分的に適用されます。これは、REPL で試してみると明らかです。

scala> List(true, false, true).filter(_)
res0: (Boolean => Boolean) => List[Boolean] = <function1>

scala> List(true, false, true).filter _
res1: (Boolean => Boolean) => List[Boolean] = <function1>

scala> List(true, false, true).filter(x=>x)
res2: List[Boolean] = List(true, true)

scala> List(true, false, true).filter(identity)
res3: List[Boolean] = List(true, true)

scala> List(true, false, true).filterNot(!_)
res4: List[Boolean] = List(true, true)

!の前に演算子が含まれているため、最後のケースがどのように機能するかに注意し_てください。これにより、関数を部分的に適用するために使用するのではなく、匿名引数として使用していることがわかります。

于 2012-11-22T23:48:43.453 に答える
2

別の角度から言えば、目標が何であるかに応じて、これは同じように短く簡潔です。

for(a <- List(true, false, true) if a) println(a)
于 2012-11-22T23:56:27.693 に答える