首页 > 解决方案 > 无法在其他文件 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?

标签: rustnamespacesimplementation

解决方案


一个实质上等效的示例出现在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(或包含的版本)应该是传递的范围。

最后,与您的类型注释相关的错误textas StringUtils::slicewill return &str, not String。根据您的需要,您应该更改 trait 及其实现,或者查看&str 和 String 之间的方式以及它们之间的区别

操场)。


您可能希望有一个更具限制性的可见性修饰符,例如pub(crate)pub(super)分别限制对包含板条箱或包含模块的可见性。

可以在 The Rust Reference 的相关部分中找到对此的更详尽的解释。


推荐阅读