Pourquoi les références aux objets trait ne sont-elles pas clonables? Ce code compile:Les références aux objets trait ne sont pas clonables
struct Test;
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
v.clone()
}
fn main() {
}
Celui-ci n'a pas:
trait Test {
fn do_smt(&self);
}
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
v.clone()
}
fn main() {
}
Erreur:
main3.rs:7:5: 7:14 error: failed to find an implementation of trait std::clone::Clone for &'a Test<no-bounds>
main3.rs:7 v.clone()
^~~~~~~~~
Cependant, Clone
trait est mis en œuvre pour tout type de référence, pour autant que je peux voir:
impl<'a, T> Clone for &'a T {
/// Return a shallow copy of the reference.
#[inline]
fn clone(&self) -> &'a T { *self }
}
Je ne vois pas pourquoi &'a Test
où Test
est un trait n'est pas clonable. C'est juste un pointeur après tout. Cette restriction interdit, par exemple, d'aller de &[&'a SomeTrait]
à Vec<&'a SomeTrait>
, ce qui ressemble à une conversion évidente, ou de cloner un Vec<&'a SomeTrait>
, comme dans l'exemple.
Ceci est très étrange pour autant que je puisse mettre en œuvre moi-même clone_vec()
, sans Clone
:
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
let mut result = Vec::new();
for &e in v.iter() {
result.push(e);
}
result
}
C'est ce que je soupçonnais. Je vais attendre l'heure d'été. Il semble que ce sera un changement spectaculaire, tant de nouvelles fonctionnalités qui facilitent la vie :) merci beaucoup! –