rust - nextel - internet at&t mexico
Copie/mueva la documentación semántica de los tipos & T/& mut T (2)
Como una adición a su código, siempre puede pedirle al compilador que le diga si se puede copiar un tipo, incluso sin poder construir ese tipo:
fn is_this_type_copy<T: Copy>() {}
fn main() {
is_this_type_copy::<&u8>();
}
Si un tipo no implementa Copy
, el compilador producirá un error.
Puede ampliar esto para hacer la pregunta para cada referencia a un tipo. Su código existente solo muestra que una referencia inmutable a un tipo específico implementa Copy
:
fn is_every_reference_copy<T>() {
is_this_copy::<&T>()
}
Haciendo lo mismo para &mut T
:
fn is_every_mut_reference_copy<T>() {
is_this_copy::<&mut T>()
}
Produce el mismo error que viste:
error[E0277]: the trait bound `&mut T: std::marker::Copy` is not satisfied
--> src/main.rs:8:5
|
8 | is_this_copy::<&mut T>()
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `&mut T`
|
= note: required by `is_this_copy`
Ya hemos visto por qué &mut T
no se puede copiar, pero ¿por qué no se puede copiar? En cierto modo, ese es el punto completo de una referencia. Una referencia es una forma de compartir datos de manera económica. En lugar de necesitar clonar (potencialmente costoso) algo para dar a múltiples cosas, podemos simplemente darle a cada cosa una referencia ligera sobre lo original. Si las referencias no se pudieron copiar, no tendrían casi la misma cantidad de valor.
Estoy buscando el documento sobre la semántica de copiar / mover de referencia y los tipos de referencia mutables.
El siguiente fragmento de código muestra que las referencias inmutables ( & T
) implementan el rasgo de Copy
y las referencias mutables ( &mut T
) no.
struct T;
fn copyable<U>(_: U) where U: Copy {}
fn main() {
let a = &T;
copyable(a); // OK
let b = &mut T;
copyable(b);
// error: the trait `core::marker::Copy` is not implemented for the type `&mut T`
}
Pero no puedo encontrar la descripción de este comportamiento. ¿Alguien sabe algunos documentos (no) oficiales? (¿o estoy equivocado?)
Rust''s std::marker::Copy
referencia del rasgo de std::marker::Copy
dice (gracias a @Chris Emerson ):
¿Cuándo mi tipo no puede ser Copiar?
Algunos tipos no se pueden copiar de forma segura. Por ejemplo, copiar&mut T
crearía una referencia mutable con alias, y al copiarString
generarían dos intentos para liberar el mismo búfer.
[...]