gpt4 book ai didi

rust - 不能在其他文件 rust 中使用已实现的特征

转载 作者:行者123 更新时间:2023-12-04 16:59:42 24 4
gpt4 key购买 nike

所以我有两个文件 main.rs 和 utils.rs
我在 utils.rs 上实现了 StringUtils 方法,但是当我尝试在 main.rs 中使用该方法时
它给了我这个错误

error[E0599]: no method named `slice` found for reference `&str` in the current scope  --> src\main.rs:89:50   |89 |         let text: String = self.inner.clone().as_str().slice(self.start, self.current);   |                                                        ^^^^^ method not found in `&str`   |   = help: items from traits can only be used if the trait is implemented and in scopenote: `StringUtils` defines an item `slice`, perhaps you need to implement it  --> src\util.rs:25:1   |25 | trait 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?

最佳答案

Paths for Referring to an Item in the Module Tree 部分中出现了一个实质上等效的示例。在 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 {
| ^^^^^^^^^^^^^^^^^
这将链接到 this explanation一种方法来修复它。所以如果我们这样做 pub trait StringUtils { ... }相反,没有与使用 trait 相关的问题。
您仍然会遇到@trentcl 提到的有关 slice 的参数数量不正确的问题。 ,我认为 self.start..self.current (或包含版本)应该是传递的范围。
最后,有一个与您的 text 类型注释有关的错误。如 StringUtils::slice会返回 &str ,不是 String .根据您的需要,您应该更改特征及其实现或查看 ways to go between &str and Stringdifferences between them .
( playground )。

你可能想要一个更严格的可见性修饰符,比如 pub(crate)pub(super)分别限制对包含 crate 或包含模块的可见性。
对此的更详尽解释可以在 the relevant section in The Rust Reference 中找到。 .

关于rust - 不能在其他文件 rust 中使用已实现的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68838009/

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