ユーザーが拡張できない、ポリモーフィズムのための sealed trait
// Copyright 2025 Google LLC // SPDX-License-Identifier: Apache-2.0 // クレートは "sealed" モジュールとそのトレイトにアクセスできますが、それに // 依存するプロジェクトはアクセスできません。 mod sealed { pub trait Sealed {} impl Sealed for String {} impl Sealed for Vec<u8> {} //... } pub trait APITrait: sealed::Sealed { /* メソッド */ } impl APITrait for String {} impl APITrait for Vec<u8> {}
- 動機: クレート内ではトレイト駆動のコードを使いたい一方で、このクレートに 依存するプロジェクトがそのトレイトを実装できないようにしたい場合があります。
なぜでしょうか?
現時点では、そのトレイトはダウンストリームでの実装に対して不安定だと見なされる 可能性があります。
別の理由としては、トレイトの安易な実装に対してドメインのリスクが高い場合 (たとえば暗号分野)が挙げられます。
-
これを実現するために使う仕組みは、スーパートレイトへのアクセスを制限することで、 ダウンストリームのユーザーが自分の型に対してそのトレイトを実装できないようにする ものです。
-
なぜ単に enum を使わないのでしょうか?
-
enum は実装の詳細、つまり「これはこれらの型に対して動作する」を露出します。
-
ユーザーは API を使うために enum のバリアントコンストラクターを使う必要が あります。
-
ユーザーは自分のコード内でその enum を型として使うことができ、enum が変更 されたときには、その変更に合わせて自分のコードも更新する必要があります。
-
enum ではバリアントごとの分岐が必要ですが、sealed trait ではコンパイラが 各型に対して単相化された関数を指定できます。
-