プログラミング言語Rustでは、構造体のメソッドやフィールドへのアクセスレベル(可視性)は修飾子によって制御されます:pub、pub(crate)、pub(super)、および修飾子がない場合(デフォルトではプライベート)。
Rustは、コンポーネントの信頼性と隔離を確保するために最初に設計されました。構造体の内部部分へのアクセス制御により、データをカプセル化し、実装の詳細を隠し、必要なインターフェースのみを公開できます。
開発者はしばしば、構造体が公開されているが、そのフィールドがプライベートのままである場合や、フィールドの公開性が構造体やモジュール自体の可視性制限のために不十分である場合に直面します。特にネストされたレベルを理解するのは難しいです:公開されたネストされた構造体は、含まれているモジュールが隠されている場合はアクセスできないことがありますし、その逆もあります。
Rustでは、アクセス修飾子が構造体、フィールド、およびメソッドだけでなく、モジュールや関数にも適用されます。次のようなレベルがあります:
pub - どこからでもアクセス可能。pub(crate) - 現在のクレート内のみアクセス可能。pub(super) - 親モジュールからのみアクセス可能。コードの例:
mod outer { pub struct PublicStruct { pub field: u32, hidden: u32, } pub(crate) struct CrateStruct { pub value: i32, } struct PrivateStruct { pub secret: i32, } pub mod inner { pub(super) struct SuperStruct { pub super_field: u8, } } }
主な特徴:
構造体がpubとして宣言され、そのフィールドが修飾子なしである場合、他のモジュールからアクセスできますか?
いいえ、構造体自体は公開されますが、フィールドはモジュール内でプライベートのままです。フィールドにアクセスするには、pubとして宣言する必要があります。
構造体をpub(crate)として宣言し、その内部フィールドをpubとして宣言した場合、どうなりますか?
可視性は構造体によって制限されます。フィールドがpubであっても、クレートの外からアクセスすることはできません。
pub(crate) struct Secret { pub data: i32, // pubは"そのまま"pub(crate)を通過しません }
プライベートモジュール内でpubとして構造体を宣言し、外部からアクセスできますか?
いいえ。最終的な可視性は構造体とモジュールの間の最小値によって決まります。モジュールがプライベートである場合、その内部の構造体や関数もモジュールの外には見えません。
プロジェクトで、開発を迅速に進めるためにすべての構造体を公開し、フィールドを開放しました。その結果、後で互換性を維持し、フィールドへのアクセスを管理するのが難しくなりました。
利点:
欠点:
公開構造体のためにプライベートフィールドと公開のコンストラクタ/アクセサーメソッドを実装しました。構造体は必要なモジュールレベルでのみエクスポートされています。
利点:
欠点: