gpt4 book ai didi

module - 模块中有多个文件

转载 作者:行者123 更新时间:2023-11-29 08:11:38 24 4
gpt4 key购买 nike

我致力于在 Rust 中实现 Repository 模式。

我需要两个(或更多)文件:

  • entity.rs — 数据描述
  • repository.rs — 数据访问方法
  • ...

问题:

一个文件意味着一个模组。这意味着 repository.rs 中的函数要访问 entity.rs 中的结构字段,需要 field酒吧。有什么办法可以避免这种情况吗?

最佳答案

在 Rust 中,模块是独立的。与 C++ 或 Java 不同,没有通过 friend 或使用反射作弊。

因此,如果您(任意地)尝试将 struct 的定义与负责维护其封装的方法分开,您将对抗该语言。


解决方案 1:首选非成员非友元函数

定义绝对需要访问entity.rs中字段的方法;如果您遵循 C++ 中的“首选非成员非友元函数”指南,您应该会看到实际上大多数方法不需要直接访问字段。例如,empty 可以根据 len 定义:

fn empty(c: &Container) -> bool { c.len() == 0 }

然后,repository.rs 可以根据需要添加许多其他方法,但必须通过 entity.rs 导出的“最小”接口(interface)来实现它需要。由于您可以控制这两个模块,因此您可以随意调整 entity.rs 的方法,所以这应该不是问题。

我要指出的是,在封装方面,这是明智的决定:减少可以访问对象内部的方法的数量减少了可以将这个对象放入一个对象中的方法的数量无效状态。

此解决方案是有利的,因为您无需与语言作斗争。


解决方案 2:完全拆分

另一种解决方案是复制您的实体:

  • 拥有完全公开的内部实体
  • 有外部实体,不透明

这是通过以下方式实现的:

pub struct SomeEntImpl {
pub field0: i32,
}

pub struct SomeEnt {
inner: SomeEntImpl,
}

授权模块将被赋予对 SomeEntImpl 的引用,而其他模块将不得不使用通过 SomeEnt 可用的受限接口(interface)。控制谁能看到什么将通过谨慎的导出实现。

这个解决方案可能会让你发疯。

关于module - 模块中有多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com