封印されたクラスは「Scalaでのプログラミング」で説明されていますが、封印された特性は記述されていません。封印された特性に関する詳細情報はどこで入手できますか?
封印された特性が封印されたクラスと同じかどうか知りたいのですが?または、そうでない場合、違いは何ですか?いつ封印された特性を使用するのが良いのですか(そうでない場合)?
封印されたクラスは「Scalaでのプログラミング」で説明されていますが、封印された特性は記述されていません。封印された特性に関する詳細情報はどこで入手できますか?
封印された特性が封印されたクラスと同じかどうか知りたいのですが?または、そうでない場合、違いは何ですか?いつ封印された特性を使用するのが良いのですか(そうでない場合)?
回答:
sealed
形質は唯一のその宣言と同じファイルに拡張することができます。
それらはしばしばの代替を提供するために使用されますenums
。それらは単一のファイルでのみ拡張できるため、コンパイラーはすべての可能なサブタイプを知っており、それについて推論することができます。
たとえば、次のように宣言します。
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
一致が完全でない場合、コンパイラーは警告を出します。
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
したがって、可能なサブタイプの数が有限で事前にわかっている場合は、シールドされた特性(またはシールドされた抽象クラス)を使用する必要があります。その他の例については、リストとオプションの実装を確認できます。
封印された特性は封印されたクラスと同じですか?
限りでsealed
は、はい。もちろん、trait
との通常の違いを共有していclass
ます。
または、そうでない場合、違いは何ですか?
Moot。
いつ封印された特性を使用するのが良いですか(そうでない場合)?
あなたが持っているならsealed class X
、あなたはチェックする必要がありますX
サブクラスと同様。同じことはsealed abstract class X
またはには当てはまりませんsealed trait X
。だから、あなたはそうすることができますがsealed abstract class X
、それは単なるtrait
利点よりもはるかに冗長です。
を使用する主な利点 abstract class
overtrait
パラメーターを受け取ることができることです。この利点は、型クラスを使用する場合に特に関係があります。たとえば、ソートされたツリーを作成するとします。あなたはこれを書くことができます:
sealed abstract class Tree[T : Ordering]
しかし、これを行うことはできません:
sealed trait Tree[T : Ordering]
なぜなら、コンテキストの境界(およびビューの境界)は暗黙的なパラメーターを使用して実装されているからです。トレイトはパラメータを受け取ることができないので、それを行うことはできません。
個人的には、sealed trait
特別な理由でを使用しない限り、私はそれを好み、使用しsealed abstract class
ます。そして、私は微妙な理由について話しているわけではありませんが、型クラスの使用など、あなたが無視できない直接的な理由について話しているのです。
[A: F]
)は、分散制約と同じように機能しません。むしろ、暗黙のF[A]
スコープを要求するのは構文糖です。これは通常、暗黙的なパラメータ((implicit fa: F[A])
)よりも少し簡潔で読みやすい方法でタイプクラスインスタンスを呼び出すために使用されますが、内部的にはまったく同じように機能しますが、Danielが指摘するように、特性は実行できませんそれ。
トレイトが「封印」されると、そのすべてのサブクラスが同じファイル内で宣言され、特定のコンパイラチェックを可能にするサブクラスのセットが有限になります。
また、仕様を示す必要性も感じています。
の 密封された MODI FiのERはFi回線nitions・デ・クラスに適用されます。密封されたクラスを直接継承テンプレートを継承クラスと同じソースファイル内に定義さドFiがある場合を除いて、継承されなくてもよいです。ただし、シールクラスのサブクラスはどこにでも継承できます。
簡単:
詳細については、Scalaのシールドされた特性に関する すべて