Приведенный ниже пример является просто примером, я знаю, что мне не нужен клон, чтобы это работало, но если бы S
было перечислением с [T]
и Vec<T>
и я хотел бы изменить размер вектора, T
должно быть Clone
.
struct S<'a, T>{
a: &'a [T]
}
impl<'a, T> S<'a, T> {
pub fn borrow(&self) -> &[T]
where [T]: Clone {
self.a
}
}
fn main() {
let slice:[u8;3] = [1,2,3];
let x = S{a: &slice};
x.borrow();
}
Ошибка:
error[E0277]: the trait bound `[u8]: Clone` is not satisfied
--> src/main.rs:17:7
|
17 | x.borrow();
| ^^^^^^ the trait `Clone` is not implemented for `[u8]`
Итак, почему не [u8]
Clone
?
[T]
является типом без размера и, следовательно, не может бытьClone
d (обратите внимание, чтоClone::clone
возвращаетSelf
, но[T]
не может находиться в стеке). ОднакоBox<[T]>
действительно реализуетClone
ifT: Clone
, потому что он живет в куче.