我想从BytesMut对象一次一个角色.为此,我使用了bytes::Buf性状中的get_u8().

因为,BytesMut implements bytes::Buf,我希望我可以直接对BytesMut对象调用get_u8,而不必在我对BytesMut对象调用get_u8()的文件中导入use bytes::Buf特征.

我得到的错误是:

no method named `get_u8` found for struct `BytesMut` in the current scope
items from traits can only be used if the trait is in scope.

我得到了这个错误,并且意识到我必须用use bytes::Buf导入当前文件中的特征.我不确定的是这种实现背后的理由.

推荐答案

Rust 特性不一定要实现inside struct 自己的impl.一般而言,特性可以在定义 struct 或特性的 crate 中实现(因为存在毯子impl、参考类型和多参数特性,所以确切的规则稍微复杂一些).所以如果你在类型Foofoo上调用foo.bar,那么这实际上可能是trait Bar上的bar方法,它位于某个不知名的 crate 中,与定义Foo的 crate 无关.

铁 rust 不能搜索你机器上安装的每个可能的 crate 来寻找这种方法.这将使编译速度减慢到爬行,还会产生一些非常令人困惑的错误消息.相反,Rust要求特征方法在调用时在作用域内.

// foo.rs (in crate my_foo)
pub struct Foo;

// bar.rs (in crate my_bar)
pub trait Bar {
  fn bar(&self);
}

impl Bar for Foo {
  fn bar(&self) {
    println!("Hello :)");
  }
}

在这种情况下,实现impl Bar for Foo不在与Foo本身相同的文件中(甚至不在相同的 crate 中),所以除非Rust要求您具有作用域内的特征方法,否则它不知道bar是什么,如果Foo是作用域内的话是even.

Rust相关问答推荐

属性宏修改派生宏的派生实现

有条件默认实现

无需通过ASIO输入音频,并使用cpal进行反馈示例

如何在rust中有条件地分配变量?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

用于判断整数块是否连续的SIMD算法.

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

这是什么:`impl Trait for T {}`?

信号量释放后 Rust 输出挂起线程

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

我可以禁用发布模式的开发依赖功能吗?

pyO3 和 Panics

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

bcrypt 有长度限制吗?

如何在 Rust 中编写修改 struct 的函数

如何将切片推入数组?

为什么这里需要类型注解?