Anuncios

Bienvenidos sean a este post, hoy veremos como pasar valores entre variables.

Anuncios

Si bien hasta ahora hemos visto de forma muy basica como establecer valores a nuestras variables, arrays, vectores y tuples, como en todo lenguaje de programacion las variables pueden recibir valores de otras variables y pasarse a traves de funciones o distintos bloques, al igual que en muchos lenguajes podemos pasar valores de dos formas:

  • Por valor
  • Por referencia
Anuncios

Pasar datos por valor significa un cambio permanente del propietario, es decir que el llamador a la funcion no puede acceder al valor o puede implicar la copia de los datos en memoria, en cambio por referencia usualmente implica tomar prestado, es decir que a diferencia del anterior la propiedad se toma temporalmente y esta puede ser usada despues de la funcion, vamos a ver un ejemplo de como trabajar pasando por valor.

Anuncios

Para ello crearemos un nuevo proyecto que llamaremos porvalor y le cambiaremos el codigo generado en main.rs con el siguiente:

main.rs

fn main() {
	let valor = agregar(3, 5);
	println!("{}", valor);
}

fn agregar(a: i32, b: i32) -> i32
{
	a + b
}
Anuncios

Antes de hablar del main vamos a ver la funcion agregar, mas adelante hablaremos sobre funciones por ahora veremos algo muy basico, siempre van a tener un nombre que lo identifiquen, en este caso definimos dos argumentos para recibir valores, primero sera el identificador seguido del tipo, por ultimo tenemos esto:

-> i32
Anuncios
Anuncios

Esto le dira al lenguaje que la funcion devolvera un valor de tipo int de 32 bits, en este caso es asi porque si observan el bloque realizamos la suma de los dos valores que recibiremos, otro dato curioso es que no terminamos la linea con el punto y coma (;), de esto hablaremos en otro post por ahora quedemonos con el concepto de que sin el punto y coma este valor se devolvera, con esto comentado pasemos al main, en este caso primero crearemos una variable que llamaremos valor, en esta recibiremos el valor devuelto por la funcion agregar y le pasamos dos valores para que haga la suma, por ultimo mostramos el resultado almacenado en valor, compilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/porvalor$ cargo build; cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/porvalor`
8
tinchicus@dbn001vrt:~/lenguajes/rust/porvalor$
Anuncios

Pasemos a ver otro ejemplo para ver los tipo de referencia, para ello crearemos otro proyecto que llamaremos referencia, una vez generado modificaremos a main.rs de la siguiente forma:

main.rs

fn main() {
	let v1 = &3;
	let v2 = *v1;
	let valor = agregar(v1, &v2);

	println!("{}", valor);
}

fn agregar(a: &i32, b: &i32) -> i32
{
	a + b
}
Anuncios

Aqui veremos varias diferencias con el anterior, al igual que antes vamos a ver primero la funcion agregar:

fn agregar(a: &i32, b: &i32) -> i32
Anuncios

Es muy similar a lo visto en el ejemplo anterior y seguimos usando el indicador de cual tipo devolvera pero ahora la diferencia esta en el modo de indicar el tipo del argumento que recibira ya que posee un ampersand (&) el cual indica que el tipo de dato sera de referencia y no el valor directo, el resto sera igual a lo visto en el ejemplo anterior, despues tenemos unas sutiles diferencias, veamos la primera:

let v1 = &3;
Anuncios

En este caso convertimos a la primera variable en uno de referencia mediante su operador, veamos la siguiente variable:

let v2 = *v1;
Anuncios

En este caso le asignamos el valor almacendo en la variable anterior pero para ello usaremos el operador de desreferncia que es un asterisco (*) , por ultimo tenemos una nueva variable donde recibira el resultado de la funcion agregar y le pasamos las dos variables anteriores, la ultima linea solo muestra el contenido de valor, compilemos y veamos que sucede:

tinchicus@dbn001vrt:~/lenguajes/rust/referencia$ cargo build; cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/referencia`
6
tinchicus@dbn001vrt:~/lenguajes/rust/referencia$
Anuncios

Por ultimo tenemos varias formas de definir valores de tipo referencia, veamos los casos:

let mut x = 4;
let ref_x = &x;
let ref seg_ref = x;
let ref mut ter_ref = x;
Anuncios

En el primer caso es lo que vimos en el ejemplo anterior, en el segundo caso por medio de ref hacemos exactamente lo mismo y en el ultimo caso con ref mut tambien trabajamos de la misma forma, pero este codigo no funcionaria debido a que el lenguaje nos permite tener todas las referencias inmutables que necesitemos pero para una referencia mutable no debe existir ninguna previa y en este caso esta ultima no funcionaria.

Anuncios

En resumen, hoy hemos visto como pasar valores entre variables, tambien los dos tipos de transferencia de datos que disponemos, hemos hablado primero del tipo valor y luego del tipo referencia, tambien hemos visto un par de ejemplos para verlo en accion, 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