todos orden los listado lista etiquetas estructura elementos documento cuerpo rust

rust - orden - lista de etiquetas html



¿Cómo mover un campo fuera de una estructura que implementa Rasgar rasgo? (1)

Aquí hay un programa Rust no válido (Rust versión 1.1) con una función que realiza una solicitud de cliente HTTP y devuelve solo los encabezados, eliminando todos los demás campos de la respuesta.

extern crate hyper; fn just_the_headers() -> Result<hyper::header::Headers, hyper::error::Error> { let c = hyper::client::Client::new(); let result = c.get("http://www.example.com").send(); match result { Err(e) => Err(e), Ok(response) => Ok(response.headers), } } fn main() { println!("{:?}", just_the_headers()); }

Aquí están los errores del compilador:

main.rs:8:28: 8:44 error: cannot move out of type `hyper::client::response::Response`, which defines the `Drop` trait main.rs:8 Ok(response) => Ok(response.headers), ^~~~~~~~~~~~~~~~ error: aborting due to previous error

Entiendo por qué el verificador de préstamos no acepta este programa, es decir, que la función drop usará la response después de que se haya movido el miembro de headers .

Mi pregunta es: ¿Cómo puedo evitar esto y aún tener un buen código Rust seguro? Sé que puedo hacer una copia , a través de clone() , así:

Ok(response) => Ok(response.headers.clone()),

Pero, viniendo de C ++, eso parece ineficiente. ¿Por qué copiar cuando un movimiento debería ser suficiente? Imagino en C ++ hacer algo como lo siguiente para forzar una llamada a un constructor de movimientos, si está disponible:

headers_to_return = std::move(response.headers);

¿Hay alguna forma de renunciar a la copia en Rust y, en cambio, forzar un movimiento , similar a C ++?


Puede usar std::mem::replace() para intercambiar el campo con un nuevo valor en blanco para transferirle la propiedad:

extern crate hyper; fn just_the_headers() -> Result<hyper::header::Headers, hyper::error::Error> { let c = hyper::client::Client::new(); let result = c.get("http://www.example.com").send(); match result { Err(e) => Err(e), Ok(mut response) => Ok(std::mem::replace(&mut response.headers, hyper::header::Headers::new())), } } fn main() { println!("{:?}", just_the_headers()); }

Aquí, estamos reemplazando response.headers con un nuevo conjunto vacío de encabezados. replace() devuelve el valor que se almacenó en el campo antes de reemplazarlo.