Tôi muốn thực hiện Deref
và DefrefMut
trên một cấu trúc sở hữu một đặc điểm đóng hộp, ví dụ:thực hiện Deref trên một cấu trúc sở hữu một đặc điểm đóng hộp
use std::ops::{Deref, DerefMut};
trait Quack {
fn quack(&self);
}
struct QuackWrap {
value: Box<Quack>
}
impl Deref for QuackWrap {
type Target = Box<Quack>;
fn deref<'a>(&'a self) -> &'a Box<Quack> {
&self.value
}
}
impl DerefMut for QuackWrap {
fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack> {
&mut self.value
}
}
này thất bại trong việc biên dịch với các lỗi sau:
src/main.rs:14:5: 16:6 error: method `deref` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime [E0053]
src/main.rs:14 fn deref<'a>(&'a self) -> &'a Box<Quack> {
src/main.rs:15 &self.value
src/main.rs:16 }
src/main.rs:20:5: 22:6 error: method `deref_mut` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime [E0053]
src/main.rs:20 fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack> {
src/main.rs:21 &mut self.value
src/main.rs:22 }
Nếu tôi thay thế Box<Quack>
bằng Box<String>
(hoặc một loại tương tự), nó hoạt động. Vấn đề là Quack
là một đặc điểm. Nhưng tôi không chắc tại sao lại tạo ra thông báo lỗi. Bất kỳ ý tưởng?
Câu hỏi của tôi tương tự như another SO question, nhưng không hoàn toàn giống nhau. Trong câu hỏi đó, cấu trúc có một tham số kiểu với đặc tính như một ràng buộc. Trong khi đó, trong câu hỏi của tôi, không có tham số kiểu.
Tôi không muốn gây nhầm lẫn các vấn đề, nhưng có một lý do chính đáng là tôi cần Box<Quack>
trong đơn đăng ký của mình. I E. Tôi không thể thay thế Quack
bằng thông số loại. Trong trường hợp bạn quan tâm, lý do là discussed further in another SO question. hơn
'loại Target = Box;' là 'loại Target = Hộp ;', và '&' a Box ' là '& 'a Box '. –