string pointers rust

string - ¿Cómo transformo & str to ~ str en Rust?



pointers (3)

Al principio pensé que era posible usar la copy line para crear un puntero de propiedad desde el puntero prestado a la cadena, pero aparentemente esto copia el puntero enterrado.

Entonces encontré str::from_slice(s: &str) -> ~str . Esto es probablemente lo que necesitas.

Por cierto, esto es para el enlace troncal 0.6 Rust actual, no está seguro del compromiso exacto.

Digamos que quiero para cada una sobre algunas cadenas, y mi cierre toma un argumento de puntero de cadena prestado (& str). Quiero que mi cierre agregue su argumento a un vector de propiedad de cadenas propiedad ~ [~ str] que se devolverá. Mi comprensión de Rust es débil, pero creo que las cadenas son un caso especial en el que no se pueden desreferenciarlas con * ¿verdad? ¿Cómo puedo hacer que mis cadenas de & str ingresen al método push del vector que toma un ~ str?

Aquí hay un código que no compila

fn read_all_lines() -> ~[~str] { let mut result = ~[]; let reader = io::stdin(); let util = @reader as @io::ReaderUtil; for util.each_line |line| { result.push(line); } result }

No se compila porque es inferir que el tipo de resultado es [& str] ya que eso es lo que estoy presionando. Sin mencionar que su vida útil será incorrecta ya que le estoy agregando una variable de vida más corta.

Me doy cuenta de que podría usar el método read_line () de ReaderUtil que devuelve a ~ str. Pero esto es solo un ejemplo.

Entonces, ¿cómo obtengo una cadena propia de una cadena prestada? O estoy totalmente malentendido


Debe llamar al método del rasgo StrSlice, to_owned, como en:

fn read_all_lines() -> ~[~str] { let mut result = ~[]; let reader = io::stdin(); let util = @reader as @io::ReaderUtil; for util.each_line |line| { result.push(line.to_owned()); } result }

Los documentos de rasgo de StrSlice están aquí:

http://static.rust-lang.org/doc/core/str.html#trait-strslice


Usted no puede

Por un lado, no funciona de forma semántica: a ~str promete que solo una cosa la posee a la vez . Pero a &str se toma prestado, entonces, ¿qué pasa con el lugar del que tomaste prestado? No tiene forma de saber que estás tratando de robar su única referencia, y sería bastante grosero tirar la información de quien llama, además.

Por otro lado, no funciona de forma lógica: ~ -puntos y @ -puntos se asignan en montones completamente diferentes, y a & no sabe qué montón, por lo que no se puede convertir a ~ y todavía garantiza que los datos subyacentes Vive en el lugar correcto.

Así que puedes usar read_line o hacer una copia, lo cual ... no estoy muy seguro de cómo hacerlo :)

Me pregunto por qué la API es así, cuando & es el más restringido de los punteros. ~ debería funcionar igual de bien aquí; no es como que las cadenas iteradas ya existen en otro lugar y necesitan ser prestadas.