rust - Hace println! pedir prestado o ser dueño de la variable?
ownership (1)
¡Se
print!
macros
print!
,
println!
,
eprint!
,
eprintln!
,
write!
,
writeln!
y
format!
son un caso especial, no se comportan como lo hacen las cosas normales por razones de conveniencia.
El hecho de que tomen referencias en silencio es parte de esa diferencia.
fn main() {
let x = 5;
println!("{}", x);
}
Ejecútelo a través de
rustc -Z unstable-options --pretty expanded
en el compilador nocturno y ¡podemos ver qué
println!
se expande a:
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;
fn main() {
let x = 5;
::io::_print(::std::fmt::Arguments::new_v1(
{
static __STATIC_FMTSTR: &''static [&''static str] = &["", "/n"];
__STATIC_FMTSTR
},
&match (&x,) {
(__arg0,) => {
[
::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt),
]
}
},
));
}
Ordenado mucho, es esto:
use std::fmt;
use std::io;
fn main() {
let x = 5;
io::_print(fmt::Arguments::new_v1(
&["", "/n"];
&[fmt::ArgumentV1::new(&x, fmt::Display::fmt)],
));
}
Tenga en cuenta la
&x
.
Si escribe
println!("{}", &x)
, entonces está tratando con dos niveles de referencias;
esto tiene el mismo resultado porque hay una implementación de
std::fmt::Display
para
&T
donde
T
implementa
Display
(se muestra como
impl<''a, T> Display for &''a T where T: Display + ?Sized
) que solo lo pasa a través.
También podría escribir
&&&&&&&&&&&&&&&&&&&&&&&x
.
Estoy confundido con los préstamos y la propiedad. En la documentación de Rust sobre referencias y préstamos
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", x);
Ellos dicen
println!
puede pedir prestadox
.
Estoy confundido por esto.
Si
println!
pide prestado
x
, ¿por qué pasa
x
no
&x
?
Intento ejecutar este código a continuación
fn main() {
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", &x);
}
¡Este código es idéntico al código anterior excepto que paso
&x
para
println!
.
Imprime ''6'' en la consola, lo cual es correcto y es el mismo resultado que el primer código.