Anuncios

Bienvenidos sean a este post, hoy veremos al tipo String de las variables.

Anuncios

Cuando hablamos de variables de tipo String nos referimos a las capaces de poder almacenar texto, en antiguos lenguajes se debia recurrir en el tipo char (array de caracteres) o importar alguna libreria que nos permita manejarla pero en los tiempos actuales ya es un tipo mas y viene soportada desde la base de los mismos, para definir una variable de tipo String existen dos formas:

let cdn = "Hola, Mundo!";
Anuncios

Donde a una variable le agregamos el literal entre comillas y el lenguaje lo convertira automaticamente, y la otra es:

let mut cdn = String::new();
Anuncios
Anuncios

En este caso lo que hacemos es utilizar a la clase String y por medio del metodo new, que es un constructor, nos permite reservar un espacio en la parte alta de la memoria (heap) y ahi almacenar todo lo que sea necesario, la principal diferencia entre ambas es que la primera sera inmutable porque la definimos asi y le pasamos un valor literal, en el segundo caso al reservar un espacio en memoria no tendra un valor determinado, si bien este ultimo nos permite tener un tamaño reservado dinamico, es decir que se ajustara a lo que reciba, tambien podemos definir cual sera el tamaño que almacenara, para ello debemos hacer lo siguiente:

let mut cdn = String::with_capacity(10);
Anuncios

En este caso le decimos que reserve un espacio de 10 bytes en la memoria, por lo tanto solo almacenara hasta 10 bytes del valor que le pasemos el resto sera descartado, pasemos a ver algunos metodos disponibles:

Anuncios
  • from(&string), Crea una nueva string desde un segmento de string
  • from_utf8(Vector <u8>), Crea un nuevo buffer de string desde un Vector de utf-8
  • with_capacity(tamaño), Reserva un espacio en memoria en base al tamaño informado
  • as_bytes(), Convierte un string en un segmento de bytes
  • insert(pos, caracter), Inserta un caracter en la posicion informada en el primer argumento
  • len(), Devuelve el tamaño de un string en bytes
  • is_empty(), Verifica si el string esta vacio, devuelve un true en caso de ser verdadero y false en caso contrario
  • is_char_boundary(pos), Este método devuelve verdadero si un carácter en la posicion informada cae en un límite Unicode.
  • to_owned(), nos permite convertir un segmento de string en un string
Anuncios

Un tema que hemos mencionado pero no comentamos son los segmentos de cadenas (string slices) que podemos decir que equivalen a los literales en otros lenguajes, tomemos el siguiente ejemplo:

let titulo = "Tinchicus.com";
Anuncios

En cualquier lenguaje esto se puede considerar como un string o cadena pero en este lenguaje esto se considera como un segmento de string que pertenece a otro segmento y esta almacenado en alguna parte, estos a su vez como los literales son inmutables, con esto cubrimos lo basico de las cadenas o strings en el lenguaje, para entenderlo un poco mas vamos a crear un ejemplo y trabajaremos varios conceptos.

Anuncios

Para comenzar vamos a crear un nuevo proyecto que llamaremos cadenas y para ello ejecutaremos lo siguiente:

cargo new cadenas
Anuncios

Lo siguiente sera reemplazar el codigo existente en main.rs con el siguiente:

main.rs

fn main() {
	let cadena1 = "Tinchicus.com";
 	let cadena2 = " es el ";
	let cadena3 = "mejor lugar para aprender";

	let mut renglon = cadena1 + cadena2 + cadena3;
}
Anuncios

En este caso tenemos tres variables con tres textos o cadenas distintas, al final tenemos una variable mutable para almacenar la concatenacion de todas las variables antes creadas, vamos a compilarlo para ver que sucede:

tinchicus@dbn001vrt:~/lenguajes/rust/cadenas$ cargo build; cargo run
   Compiling cadenas v0.1.0 (/home/tinchicus/lenguajes/rust/cadenas)
error[E0369]: cannot add `&str` to `&str`
 --> src/main.rs:6:28
  |
6 |     let mut renglon = cadena1 + cadena2 + cadena3;
  |                       ------- ^ ------- &str
  |                       |       |
  |                       |       `+` cannot be used to concatenate two `&str` strings
  |                       &str
Anuncios

Como mencionamos anteriormente son segmentos de string y al ser inmutables no podemos realizar la concatenacion, para ello debemos modificar el codigo de la siguiente forma:

fn main() {
	let cadena1 = "Tinchicus.com";
 	let cadena2 = " es el ";
	let cadena3 = "mejor lugar para aprender";

	let _renglon = cadena1.to_owned() + cadena2 + cadena3;

	println!("{}", _renglon);
}
Anuncios
Anuncios

En este caso primero modificamos a la variable que sera la encargada de almacenar la concatenacion, en este caso le quitamos el mut y agregamos un guion bajo (_) tambien conocido como undescore, tiene varios usos pero en este caso es simplemente para que el compilador no nos devuelva ningun aviso o notificacion, luego utilizamos a to_owned para convertir este segmento en una string y podamos concatenar los otros segmentos a este, siempre que usemos a to_owned se hara con la primera variable y no es necesario en el resto, lo siguiente sera utilizar el macro de formato (!), en este caso solo agregamos entre comillas a dos llaves ({}), luego pasaremos la variable de la concatenacion, trabaja de forma similar a otros lenguajes donde se reemplazaran las llaves con el valor de la variable.

Anuncios
Nota:
Si desean pasar mas variables en la macro simplemente deben usar mas llaves en las comillas.
Anuncios

Por ultimo vamos a compilarlo y ver como es su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/cadenas$ cargo build; cargo run
   Compiling cadenas v0.1.0 (/home/tinchicus/lenguajes/rust/cadenas)
    Finished dev [unoptimized + debuginfo] target(s) in 0.76s
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/cadenas`
Tinchicus.com es el mejor lugar para aprender
tinchicus@dbn001vrt:~/lenguajes/rust/cadenas$
Anuncios

Vean como ahora si se compilo correctamente y nos mostro el resultado de la concatenacion de todos los textos en la variable final, antes de finalizar vamos a tomar nuestro codigo y lo modificaremos de la siguiente forma:

main.rs

fn main() {
	let mut renglon_final = String::new();

	let cadena1 = "Tinchicus.com";
 	let cadena2 = " es el ";
	let cadena3 = "mejor lugar para aprender";

	renglon_final = format!("{}{}{}", cadena1, cadena2, cadena3);

	println!("{}", renglon_final);
}
Anuncios

Observen que primero creamos una variable llamada renglon_final y utilizamos el constructor new para reservar el espacio en memoria, despueste tenemos las mismas variables de antes, lo siguiente sera pasar un valor a la variable creada al principio, para este caso usamos a la macro format, donde le pasamos la cantidad de llaves que usaremos por cada variable, en este caso tres, luego volvemos a usar a println, para mostrar el resultado final, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/cadenas$ cargo run
warning: value assigned to `renglon_final` is never read
 --> src/main.rs:2:10
  |
2 |     let mut renglon_final = String::new();
  |             ^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_assignments)]` on by default
  = help: maybe it is overwritten before being read?

warning: `cadenas` (bin "cadenas") generated 1 warning
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/cadenas`
Tinchicus.com es el mejor lugar para aprender
tinchicus@dbn001vrt:~/lenguajes/rust/cadenas$
Anuncios

En este caso tenemos un aviso con la variable que generamos al comienzo pero no se preocupen porque como pueden ver al final si funciono, esto se los paso para que vayan acostumbrandose a las salidas de nuestros codigos.

Anuncios

En resumen, hoy hemos visto al tipo String, que es, como se usa, las distintas formas de declararlo, algunos metodos que podemos utilizar, tambien un par de ejemplos para ver como trabajan las variables de este tipo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50