如何将较大的展示次数分成多个文件?

如何解决如何将较大的展示次数分成多个文件?

我真的不喜欢类功能的单片实现(用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.rsthing.rsmore_thing.rs一样远,与任何库和外部代码一样;它也可能是一个单独的箱子。本质上,您试图在外部项上声明私有方法,这当然会失败。

但是,这可能有点令人困惑,因为在涉及孤立规则时,您始终可以在同一 crate 中而不是同一 module 中实现任意项的特征>。这是因为特质实现始终是公共的(只要您可以同时访问特质和实现特质的项目;实际的孤立规则会稍微复杂一些,但这是基本思想)。

本质上:特征实现是公共的,但是方法实现默认是私有的。为了实现公共事物,您至少需要公共访问权,而为了实现私有事物,则需要私有访问权。

相反,一种解决方案是简单地声明一个将您的商品作为参数的函数。例如,在more_thing.rs中:

use super::thing::Thing;

fn foo(thing: &Thing) {
    // ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-