如何解决如何将较大的展示次数分成多个文件?
我真的不喜欢类功能的单片实现(用C ++讲)。用这种语言,我可以按自己的喜好分解事物。在Rust中,对于文件中的内容有严格的规定。
我有大约2000行impl
的结构(无评论/文档)。从逻辑上讲,它们可以分解为不同的集合;用于管理方面A的功能,用于管理方面B的功能... ...它们全都占用struct
数据上的大量时间,因此将struct
切碎将无济于事。
我在一个答案中看到您可以拥有
// in thing.rs
struct Thing{
.......
}
impl Thing{
fn1
fn2
}
// in more_thing.rs
use crate::thing::*;
impl Thing{
fn3,fn4
}
// in lib.rs
mod thing;
mod more_thing;
这几乎奏效了(令我惊讶的是它真的奏效了)。它是一种中途的房子。问题是对于more_thing.rs中的方法,我必须声明Thing
所有pub
的字段。这是可行的,但不是很好。还有其他选择吗?
我知道我可以限制pub
的范围,但仍然会破坏封装。
解决方法
模块中的所有非pub
项目在其子模块中仍然可见。只需使more_thing
成为thing
的子模块,而不是其同级。您可以通过将其放在名为thing
的目录中并将mod
声明放在thing.rs
内来完成此操作:
// thing.rs (or thing/mod.rs; see below)
pub struct Thing {
field: i32,}
// Note the lack of `pub`: `more` is only an implementation detail
mod more;
// thing/more.rs
use super::Thing;
impl Thing {
// Although it is defined in a non-`pub` module,this method will be visible anywhere
// `Thing` is because it is marked `pub` and is a member of `Thing`. You can use
// `pub(crate)` or `pub(super)` instead to get different levels of visibility,or
// leave it private and it will only be available in the current module (thing::more)
pub fn field(&self) -> i32 {
// because more is a submodule of thing,non-`pub` members are visible here.
self.field
}
}
如果您希望将所有与Thing
相关的文件保留在thing
目录中,则可以将thing.rs
重命名为特殊文件名thing/mod.rs
,它将准确地工作同样的方式。
为什么不将impl块放在同一文件中?
in thing.rs
struct Thing {
.......
}
impl Thing {
fn1
fn2
}
impl Thing {
fn3,fn4
}
尽管仍然有一个大文件,但方法已拆分。
,默认情况下,所有方法在Rust中都是私有的,这意味着它们只能在其包含的 module (永远不会大于文件)的范围内访问,在这种情况下为thing.rs
。 thing.rs
与more_thing.rs
一样远,与任何库和外部代码一样;它也可能是一个单独的箱子。本质上,您试图在外部项上声明私有方法,这当然会失败。
但是,这可能有点令人困惑,因为在涉及孤立规则时,您始终可以在同一 crate 中而不是同一 module 中实现任意项的特征>。这是因为特质实现始终是公共的(只要您可以同时访问特质和实现特质的项目;实际的孤立规则会稍微复杂一些,但这是基本思想)。
本质上:特征实现是公共的,但是方法实现默认是私有的。为了实现公共事物,您至少需要公共访问权,而为了实现私有事物,则需要私有访问权。
相反,一种解决方案是简单地声明一个将您的商品作为参数的函数。例如,在more_thing.rs
中:
use super::thing::Thing;
fn foo(thing: &Thing) {
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。