このコードには、Scala に関するいくつかの誤解があります。最初に対処する必要があるのは次のとおりです。
def any(check: Set[Any], expr: Boolean): Boolean = {
var checked = check.filter(_ => expr)
if (checked == Set())
return false
else
return true
}
any(Set(3, 4, 5, 6), _ > 5)
まず、expr
ですBoolean
。ABoolean
はどちらかtrue
またはfalse
-- それ以外にはなり得ません。一方、expr
は「式」に由来します。これは、評価する必要がある式と考えられます。したがって、expr
とBoolean
が一致する可能性は低いため、概念上の問題が進行中であることを示す最初の手がかりです。
ここで、パラメーター_ > 5
として渡しますが、どちらでもありません。は true になりますが、false になりますが、は関数であり、関数は ではありません 。expr
_ > 5
true
false
10 > 5
3 > 5
_ > 5
Boolean
アンダースコアを考えてみましょう..._ > 5
は を意味し(x) => x > 5
ます。_ > _
などを意味(x, y) => x > y
します。アンダースコアをよく理解していない場合は、使用しないでください。代わりに完全な構文を使用してください。後で理解できるようになるので、学習を遅らせる必要はありません。
ここで、他の概念的な問題のためにそれを取り上げます。これは次のとおりです。
_ => expr
z => expr
これは、受け取ったパラメータを完全に無視する関数とほぼ同等です。ここでのアンダースコアの意味は上記とは異なることに注意してください。実際、この回答では、アンダースコアの 11 の異なる意味を数えたことがあります。アンダースコアを理解するまでアンダースコアの使用を避けるもう 1 つの理由。
したがって、コードの問題は次のとおりです。
Boolean
あなたが望んでいたところに を受け取っていますFunction1[Any, Boolean]
。
- フィルタリングする必要があるかどうかを計算するときに、フィルタリングされている要素を無視しています(1のためにコンパイルされた唯一の構文であるためだと思います)。
- 期待される場所に関数を渡しています
Boolean
。
_ > 6
は有効なFunction1[Any, Boolean]
ではなく、Any
は を実装していないため、1 と 2 を修正してもコードは機能しません>
。
あなたは動的言語のバックグラウンドAny
を持っているのではないかと思います。あなたが扱っているもののタイプを伝える必要がないための簡単な「フォールバック」として使用します。やらないでください - を使っAny
ても物事が簡単になるわけではなく、物事が難しくなります。
そのメソッドを正しく記述する方法を示す他の2つの回答があります。詳細はそれらに任せます。私は一般的な問題に対処したかっただけで、将来そのような問題を回避するためにあなたを導くことができないかどうかを確認したかった.