MST

星途 面试题库

面试题:Rust中pub关键字在模块内不同位置使用的差异

在Rust模块系统里,pub关键字用于控制项的可见性。请阐述在模块内部,将pub关键字置于函数定义之前、结构体定义之前以及结构体字段定义之前,它们的使用范围和可见性规则分别是怎样的?并举例说明。
26.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

1. pub关键字置于函数定义之前

  • 使用范围:用于将函数定义为公共函数,使得该函数在其所在模块的外部也能被调用。
  • 可见性规则:如果函数所在模块是公共的(使用pub mod声明),那么该公共函数在模块树中,只要父模块可见,该函数就能被访问。
  • 示例
mod my_module {
    // 定义公共函数
    pub fn public_function() {
        println!("This is a public function.");
    }
}

fn main() {
    my_module::public_function();
}

2. pub关键字置于结构体定义之前

  • 使用范围:使结构体在模块外部可见。不过,结构体的字段默认仍然是私有的,即使结构体本身是公共的。
  • 可见性规则:与公共函数类似,只要结构体所在模块是公共的,在模块树中,只要父模块可见,该结构体就能被引用。
  • 示例
mod my_module {
    // 定义公共结构体
    pub struct PublicStruct {
        // 私有字段
        private_field: i32,
    }

    impl PublicStruct {
        // 公共结构体的公共方法
        pub fn new() -> Self {
            PublicStruct { private_field: 42 }
        }
    }
}

fn main() {
    let instance = my_module::PublicStruct::new();
    // 不能直接访问private_field,因为它是私有的
    // println!("{}", instance.private_field); 
}

3. pub关键字置于结构体字段定义之前

  • 使用范围:不仅使结构体在模块外部可见,还使该字段在模块外部也能被访问。
  • 可见性规则:当结构体和字段都标记为pub,并且结构体所在模块是公共的,在模块树中,只要父模块可见,该结构体及其公共字段就能被访问。
  • 示例
mod my_module {
    // 定义公共结构体
    pub struct PublicStruct {
        // 公共字段
        pub public_field: i32,
    }
}

fn main() {
    let instance = my_module::PublicStruct { public_field: 42 };
    println!("{}", instance.public_field); 
}