pubと可視性
アクセスを制御します
「pubと可視性」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
デフォルトでは非公開
Rustでは、モジュール内のすべての要素がデフォルトで非公開です。pubを使って明示的に公開しない限り、他のモジュールからは見えません。
この安全なデフォルトにより、意図的に公開するまで実装の詳細を隠しておけます。
pub関数
関数にpubを付けると、モジュールの外部から呼び出せるようになります。付けない場合、呼び出しはコンパイルに失敗します。
mod math {
pub fn square(x: i32) -> i32 {
x * x
}
}
fn main() {
println!("{}", math::square(5));
}非公開のヘルパーは隠しておく
内部ヘルパーを非公開のままにして、公開APIだけを提供できます。公開関数から非公開関数を呼び出すことはできますが、外部からは呼び出せません。
mod math {
fn double(x: i32) -> i32 { x * 2 }
pub fn quadruple(x: i32) -> i32 { double(double(x)) }
}
fn main() {
println!("{}", math::quadruple(3));
}pub構造体ではフィールドが非公開
構造体にpubを付けると型が公開されますが、各フィールドにもpubを付けない限り、フィールドは非公開のままです。
これにより、構造体の作成方法や変更方法を制御できます。
mod model {
pub struct User {
pub name: String,
age: u32,
}
impl User {
pub fn new(name: String, age: u32) -> User {
User { name, age }
}
pub fn age(&self) -> u32 { self.age }
}
}
fn main() {
let u = model::User::new(String::from("Sam"), 28);
println!("{} is {}", u.name, u.age());
}フィールドを隠す理由
非公開のフィールドによって不変条件を守れます。呼び出し側はコンストラクターとメソッドを使う必要があるため、入力を検証したり、利用者を壊さずに後から内部構造を変更したりできます。
pub列挙型ではすべてを公開
構造体とは異なり、pubを付けた列挙型では、すべてのバリアントが自動的に公開されます。バリアントごとに可視性を指定することはできません。
mod traffic {
pub enum Light {
Red,
Yellow,
Green,
}
}
fn main() {
let l = traffic::Light::Green;
let go = matches!(l, traffic::Light::Green);
println!("go = {}", go);
}pub(crate):クレート全体に公開
pub(crate)を付けると、同じクレート内のどこからでも要素が見えるようになりますが、依存している外部クレートからは見えません。
モジュール間で共有する内部APIに最適です。
mod config {
pub(crate) fn default_port() -> u16 {
8080
}
}
fn main() {
println!("{}", config::default_port());
}pub(super):親モジュールだけに公開
pub(super)を付けると、要素は親モジュールにだけ公開されます。完全なpubよりも限定的な公開範囲です。
mod outer {
pub fn run() {
inner::helper();
}
mod inner {
pub(super) fn helper() {
println!("visible to parent only");
}
}
}
fn main() {
outer::run();
}pub useによる再公開
pub useは要素を再公開し、より短く便利なパスから呼び出せるようにします。これにより、使いやすい公開APIを構成できます。
mod deep {
pub mod nested {
pub fn ping() {
println!("pong");
}
}
pub use nested::ping;
}
fn main() {
deep::ping();
}公開APIを設計する
目的を達成するために必要最小限の範囲だけを公開しましょう。ヘルパーは非公開にし、構造体のフィールドはメソッドの背後に隠し、内部で共有する場合はpub(crate)を使います。
APIの範囲を絞ると、利用者を壊さずに発展させやすくなります。
可視性レベルのまとめ
制限が厳しい順:
- デフォルト(モジュール内のみ非公開)
pub(super)— 親モジュールから見えるpub(crate)— クレート全体から見えるpub— どこからでも見える
理解度チェック
可視性についての理解度を確認しましょう。
まとめ
アクセスを制御する方法を学びました。
- アイテムはデフォルトで非公開です。
pubで公開します pub構造体でも、各フィールドにpubを付けない限りフィールドは非公開ですpub列挙型ではすべてのバリアントが公開されますpub(crate)とpub(super)で、より細かく制御できますpub useで再公開し、使いやすいAPIを構成できます
よくある質問
「pubと可視性」レッスンは無料ですか?
はい。「pubと可視性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「pubと可視性」で何を学びますか?
アクセスを制御します ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「pubと可視性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- モジュールとmod
- pubと可視性
- useとパス
- クレートとクレートルート