rust - 无法在其他文件 rust 中使用已实现的特征
问题描述
所以我有两个文件 main.rs 和 utils.rs
我在 utils.rs 上实现了 StringUtils 方法,但是当我尝试在 main.rs 中使用该方法时,它给了我这个错误
错误[E0599]:在当前范围内没有找到用于引用 `&str` 的名为 `slice` 的方法 --> src\main.rs:89:50 | 89 | 让文本: String = self.inner.clone().as_str().slice(self.start, self.current); | ^^^^^ 在 `&str` 中找不到方法 | =帮助:只有在实现了特征并且在范围内时才能使用特征中的项目 注意:`StringUtils`定义了一个`slice`项,也许你需要实现它 --> src\util.rs:25:1 | 25 | 特征 StringUtils { | ^^^^^^^^^^^^^^^^^
// main.rs
mod utils;
use utils::*;
...
fn add_token0(&mut self, token_type: TokenType) {
let text: String = self.inner.clone().as_str().slice(self.start, self.current);
// error: no method named `slice` found for reference `&str` in the current scope
}
...
但我已经在 utils.rs 上实现了它
// utils.rs
...
trait StringUtils {
...
fn slice(&self, range: impl RangeBounds<usize>) -> &str;
...
}
impl StringUtils for str {
...
fn slice(&self, range: impl RangeBounds<usize>) -> &str {
...
}
...
}
...
为什么我的实现不起作用,有什么办法可以解决它,或者我只能在 main.rs 上实现 StringUtils?
解决方案
一个实质上等效的示例出现在Rust 编程语言的模块树中引用项目的路径部分(如果你还没有阅读,我建议你阅读)。
简短的版本是模块中您希望其他模块可见的任何项目(例如,特征,函数定义)都应该具有pub
可见性修饰符的某种变体。在您的即时示例中,这表现为需要制作StringUtils
特征pub
(或将其暴露给包含模块的其他变体)。
实际上,如果您尝试StringUtils
直接导入,use utils::StringUtils
而不是 glob 导入,则会收到以下错误消息:
error[E0603]: trait `StringUtils` is private
--> src/lib.rs:7:12
|
7 | use utils::StringUtils;
| ^^^^^^^^^^^ private trait
|
note: the trait `StringUtils` is defined here
--> src/lib.rs:19:5
|
19 | trait StringUtils {
| ^^^^^^^^^^^^^^^^^
这将链接到这种解决方法的解释。因此,如果我们pub trait StringUtils { ... }
改为这样做,则没有与使用 trait 相关的问题。
您仍然会遇到@trentcl 提到的关于参数数量不正确的问题slice
,我认为self.start..self.current
(或包含的版本)应该是传递的范围。
最后,与您的类型注释相关的错误text
as StringUtils::slice
will return &str
, not String
。根据您的需要,您应该更改 trait 及其实现,或者查看&str 和 String 之间的方式以及它们之间的区别。
(操场)。
您可能希望有一个更具限制性的可见性修饰符,例如pub(crate)
或pub(super)
分别限制对包含板条箱或包含模块的可见性。
可以在 The Rust Reference 的相关部分中找到对此的更详尽的解释。
推荐阅读
- microsoft-graph-api - 无法在 Microsoft Teams 中将 Planner 创建为选项卡
- sql - SQL获取分组的最大日期
- python - 晨星数据导入不会给出要求的所有日期价格
- css - 如何修复 Safari mix-blend-mode: color-dodge bug?
- flyway - Flyway 中的迁移文件大小有限制吗?
- java - 无法在下拉列表中执行操作,因为通过 sendKeys 发送到期日期后会弹出日历
- optimization - Julia 代码优化,结构和原始类型之间的区别?(内存分配)
- javascript - 使用传单平移最大纬度地图
- r - data.table 返回列值的错误子集
- php - 如何根据特定条件从 2 个表中获取数据