Rust学习笔记 - 模块系统

栏目: 编程语言 · Rust · 发布时间: 4年前

内容简介:模块是 Rust 中的 私有性边界,如果你希望函数或结构体是私有的,将其放入模块。私有性规则有如下:使用使用

模块是 Rust 中的 私有性边界,如果你希望函数或结构体是私有的,将其放入模块。私有性规则有如下:

pub

使用 pub 关键字使项变为公有,一个示例如下:

mod sound {
    pub mod instrument {
        pub fn clarinet() {
            // 函数体
        }
    }
}

fn main() {
    // 绝对路径
    crate::sound::instrument::clarinet();

    // 相对路径
    sound::instrument::clarinet();
}

使用 super 开头来构建相对路径,类似文件系统中以 .. 开头的作用,一个示例如下:

mod instrument {
    fn clarinet() {
        super::breathe_in();
    }
}

fn breathe_in() {
    // 函数体
}

对结构和枚举使用 pub 的一个示例如下:

mod plant {
    pub struct Vegetable {
        pub name: String,
        id: i32,
    }

    impl Vegetable {
        pub fn new(name: &str) -> Vegetable {
            Vegetable {
                name: String::from(name),
                id: 1,
            }
        }
    }
}

fn main() {
    let mut v = plant::Vegetable::new("squash");

    v.name = String::from("butternut squash");
    println!("{} are delicious", v.name);

    // 如果将如下行取消注释代码将无法编译:
    // println!("The ID is {}", v.id);
}

使用 use 关键字将名称引入作用域的一个示例如下,优势是更加简洁、避免重复:

mod sound {
    pub mod instrument {
        pub fn clarinet() {
            // 函数体
        }
    }
}

use crate::sound::instrument; // 绝对路径
// use self::sound::instrument; // 相对路径

fn main() {
    instrument::clarinet();
    instrument::clarinet();
    instrument::clarinet();
}

通过 as 关键字重命名引入作用域的类型的一个示例如下:

use std::fmt::Result;
use std::io::Result as IoResult;

fn function1() -> Result {}
fn function2() -> IoResult<()> {}

通过 pub use 重导出名称的一个示例如下:

mod sound {
    pub mod instrument {
        pub fn clarinet() {
            // 函数体
        }
    }
}

mod performance_group {
    pub use crate::sound::instrument;

    pub fn clarinet_trio() {
        instrument::clarinet();
        instrument::clarinet();
        instrument::clarinet();
    }
}

fn main() {
    performance_group::clarinet_trio();
    performance_group::instrument::clarinet();
}

可以利用嵌套路径来消除重复的 use 书写:

use std::cmp::Ordering;
use std::io;
// to
use std::{cmp::Ordering, io};

也可以通过 glob 运算符将所有的公有定义引入作用域,例如如下示例引入了 std::collections 中定义的所有公有项:

use std::collections::*;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Game Programming Patterns

Game Programming Patterns

Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95

The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码