rust - 如何隐藏子模块中的方法但仍可从父模块中使用它?

标签 rust

我在 crate root 中定义了一个父结构,它返回一个在模块中定义的结构。我希望我的父结构是唯一能够构建子结构的东西,但是我天真的尝试很快就遇到了可以理解的隐私和可见性问题:

#![feature(unsafe_destructor)]

mod child {
    pub struct Child(u8);

    impl Child {
        fn new(v: u8) -> Child { Child(v) }
    }
}

struct Parent;

impl Parent {
    fn child(&self) -> child::Child {
        child::Child::new(42)
    }
}

fn main() {}

最佳答案

首先,你的Child struct 必须是公共(public)的,如果它是由 Parent 的方法返回的.因此你需要一个

pub use child::Child;

此外,这将意味着 Child 的实现也将公开,包括 new()方法。为防止这种情况,您可以将其移至外部辅助方法,您将重新导出。

另外,Child如果您不想使用 Child(42) 构建结构,则它应该至少有一个私有(private)字段。语法。

最后,你有这样的东西:

pub use child::Child;

mod child {
    pub struct Child {
        v: u8
    }

    pub fn build_child(v: u8) -> Child {
        Child { v: v }
    }

    impl Child {
        fn val(&self) -> u8 {
            self.v
        }
    }
}

struct Parent;

impl Parent {
    fn child(&self) -> Child {
        child::build_child(42)
    }
}

在这里,child::build_child(..)是唯一能够创建 Child 的方法实例,它在包含 Parent 定义的模块之外是不可见的.

关于rust - 如何隐藏子模块中的方法但仍可从父模块中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687122/

相关文章:

rust - 有没有一种优雅的方法来重写使用 `match`语句获取或创建Option? [复制]

rust - 如何静态链接到现有的rlib?

rust - 在使用生命周期参数调用函数时如何处理结构参数的生命周期?

pointers - 使用rust 的生活

oracle - 如何将 Oracle 查询结果返回给 Rust main 函数?

rust - 为什么通过提取方法进行重构会触发借用检查器错误?

rust - 用于记录响应正文的 Axum 中间件

rust - 当 Rust 结构包含生命周期特征时会发生什么?

rust - 将数据包读入 Rust 中的结构

rust - 在遍历对 Result 的引用时如何使用问号运算符?