我想在现有类型/结构体上创建一个包装器。根据Rust Book第19章的Newtype模式,“在包装器上实现Deref特质以返回内部类型将可以访问所有底层方法”。
然而,调用一个消耗 self 的方法会抛出一个错误:
错误:
https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
这是我对String包装器的实现。以下是一个简化的例子:struct Wrapper(String);
impl Deref for Wrapper {
type Target = String;
fn deref(&self) -> &Self::Target {
&self.0 //pointer to Inner value
}
}
然而,调用一个消耗 self 的方法会抛出一个错误:
fn main() {
let d = "Dog".to_string();
let w = Wrapper(d);
w.into_bytes();
}
错误:
错误:无法移动解引用Wrapper
move,因为值具有类型std::string::String
,它没有实现Copy
特质
因此我有两个问题:
- 我的实现有什么问题,如何使其正常工作?
- 我想使用self、&self、mut self、&mut self方法使其正常工作。如何适当地实现DerefMut?
Deref
。Deref
只应该实现于智能指针。 - Chayim Friedman