MST
星途 面试题库

面试题:Rust中模块可见性控制的基础实践

请简述在Rust中如何通过`pub`关键字来控制模块内结构体、函数和模块自身的可见性?举例说明不同情况下的使用方法。
42.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,pub关键字用于控制模块内结构体、函数和模块自身的可见性,以下是不同情况下的使用方法:

1. 控制函数的可见性

  • 默认不可见:在模块内定义的函数,默认是私有的,即只能在当前模块内部调用。
mod my_module {
    fn private_function() {
        println!("This is a private function.");
    }
}

这里private_function只能在my_module模块内部使用。

  • 使用pub使其可见:在函数定义前加上pub关键字,函数就可以被外部模块访问。
mod my_module {
    pub fn public_function() {
        println!("This is a public function.");
    }
}

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

此时在main函数中可以调用my_module::public_function

2. 控制结构体的可见性

  • 结构体可见性
    • 默认不可见:结构体默认是私有的,不能在定义它的模块之外实例化。
mod my_module {
    struct PrivateStruct {
        field: i32,
    }
}

PrivateStruct只能在my_module内部使用。 - 使用pub使其可见:在结构体定义前加上pub关键字,结构体就可以在外部模块被使用,但结构体的字段默认还是私有的。

mod my_module {
    pub struct PublicStruct {
        field: i32,
    }
}

fn main() {
    // 以下代码会报错,因为field是私有的
    // let s = my_module::PublicStruct { field: 10 };
}
  • 结构体字段可见性:如果想让结构体的字段也能在外部模块访问,需要对字段也使用pub关键字。
mod my_module {
    pub struct PublicStruct {
        pub field: i32,
    }
}

fn main() {
    let s = my_module::PublicStruct { field: 10 };
    println!("The field value is: {}", s.field);
}

这样在main函数中可以实例化PublicStruct并访问其field字段。

3. 控制模块自身的可见性

  • 默认不可见:模块默认是私有的,不能被外部模块访问。
mod private_module {
    pub fn inner_function() {
        println!("This is an inner function in a private module.");
    }
}

private_module及其内部的inner_function都不能在外部模块直接访问。

  • 使用pub使其可见:在模块定义前加上pub关键字,模块就可以被外部模块访问。
pub mod public_module {
    pub fn inner_function() {
        println!("This is an inner function in a public module.");
    }
}

fn main() {
    public_module::inner_function();
}

此时在main函数中可以调用public_module::inner_function