sealed class A
class B1 extends A
class B2 extends A
私たちはクラスA
のオブジェクトのリストを持っていると仮定すると:リスト[A] =リスト(新B1、新しいB2、新しいB1、新しいB1)isInstanceOfを使用するタイミングと、(Scalaで)match-case-statementを使用するタイミングを教えてください。
そして、我々はフィルタリングしたい:ヴァルリットル タイプB1の要素。 はその後、我々は、述語を必要とし、次の二つの選択肢使用することができます
l.filter(_.isInstanceOf[B1])
それとも
l.filter(_ match {case b: B1 => true; case _ => false})
個人的に、私はより多くの最初のアプローチを好むが、私は頻繁に読んで、人はより多くのmatch-case
ステートメントを使用する必要がありますしばしば(私が知らない理由で)。
したがって、質問はmatch-case
の代わりにisInstanceOf
を使用するという欠点がありますか?どのアプローチをいつ使うべきですか(そして、どのアプローチをここで使用すべきか、そしてその理由は何か)?
そして最後に狭い型を与えます( 'List [B1]')。 –
もっと読みやすく見える、ありがとう。しかし、この声明のデフォルトのケースは何でしょうか?このショートカットケースのステートメントに関する詳細な背景情報とその使用方法はどこで確認できますか? –
@JohnThreepwood [この投稿](http://ochafik.com/blog/?p=393)を見てください。それは最高のものではありませんが、「収集する理由」はまだかなり良いです。簡単に言うと、collectはmapのようですが、このメソッドに渡す*(部分)*関数のために定義された値に対してのみ作業を行います。この場合のScalaのパターンマッチングは[PartialFunction](http://stackoverflow.com/questions/5668053/scala-partial-functions)の上で実行されます。また、中括弧を使用する必要があります。 –