Skip to content

NahuelArn/Seminario-De-Lenguajes-Rust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Seminario-De-Lenguajes-Rust

Descripción de la imagen

a tener en cuenta

  fn main() {
    println!("sarsa");
  }
  //Convencion snake case sarasa_sarasa_pepe
  comentario 1 linea: " // "
  comentario > 1: " /* */ "
  Asignacion:  " = "
  Igualdad: " == "
  Desigualdad: " != "
  Mayor: " > "
  Menor: " < "
  Mayor o igual: " >= "
  Menor o igual: " <= "
  Y: " && "
  O: " || "
  Negación: " ! "
  Verdadero: " true "
  Falso: " false "
  booleano: " bool "
  caracter: " char "
  Imprimir: " println!() "

  ------Variables --------
  // Declaración de una variable mutable
  let mut variable_mutable = 42;

  // Declaración de una variable inmutable
  let variable_inmutable = 20;

  ------tipos de datos --------
  -str: Es un tipo de cadena de caracteres inmutable y de longitud fija.
  -String: Es un tipo de cadena de caracteres que es mutable y de longitud variable.

  let x:u32 = 5; // Variable entera inmutable
  let y:f32 = 3.5; // Variable flotante inmutable
  let z:String = "saasasra"; // Variable de cadena inmutable
  const PI: f64 = 3.14159; // Constante
  //let const //diferencia cuando quiero una variable inmutable en su ambito local y constante global inmutable

parseos

  //parseos
  fn main(){
      let a: u8 = 0;
    
      let b: i32 = a as i32; // casting entre números
      let b_u8: u8 = b as u8; // casting de i32 a u8
      println!("b: {}", b);   // b: 0
      println!("b_u8: {}", b_u8); // b_u8: 0
        
      // Convertir un número a una cadena
      let numero = 5;
      let numero_str = numero.to_string(); // convierte un número a una cadena
        
      println!("Número como cadena: {}", numero_str); // Numero como cadena: 5
  }

comportamiento de los Strings

  fn main() {
      
      -String: Es un tipo de cadena de caracteres que es mutable y de longitud variable.

      let mut a: String = String::from("pepe");   //mutable
      println!("{}", a);
      let casa: &str = " soy mutable";    //inmutable
      a+= casa;   //le asigno a(String mutable), una referencia de una cadena inmutable
      println!("{}", a);
      println!("-------------------");

      -str: Es un tipo de cadena de caracteres inmutable y de longitud fija.

      let mut b: &str = "moni";   //referencia inmutable
      println!("{}", b);
      b+= " soy mutable"; //error! b es inmutable es una cadena fija
      println!("{}", b)  //error!
  }

pedir por teclado

  //siempre lo que se pide se guarda como String
  use std::io::stdin;
  fn main() {
      println!("Ingrese su nombre: ");
      let mut nombre = String::new();
      stdin().read_line(&mut nombre).expect("Error al leer el nombre.");
      println!("Hola, {}!", nombre);
  }


  //parsear entrada String -> i32
  use std::io;

  fn main() {
      println!("ingrese un número entero:");

      let mut input = String::new();
      io::stdin().read_line(&mut input).expect("Fallo al leer la línea");

      let numero: i32 = input.trim().parse()  //trim elimina los espacios en blanco al principio y al final de la cadena
          .expect("ingrese un número válido");

      println!("Número ingresado: {}", numero);
  }


  //Parseo de un número de punto flotante (f64) parsear entrada String -> f64
  use std::io;

  fn main() {
      println!("ingrese un número de punto flotante:");

      let mut input = String::new();
      io::stdin().read_line(&mut input)
          .expect("Fallo al leer la línea");

      let numero: f64 = input.trim().parse()
          .expect("ingrese un número válido");

      println!("Número ingresado: {}", numero);
  }


  //Parseo de un carácter (char)
  
  use std::io;

  fn main() {
      println!("Por favor ingrese un carácter:");

      let mut input = String::new();
      io::stdin().read_line(&mut input)
          .expect("Fallo al leer la línea");

      let caracter: char = input.trim().chars().next()
          .expect("Por favor ingrese un carácter válido");

      println!("Carácter ingresado: {}", caracter);
  }
Longitud Con Signo Sin Signo Flotante +-
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32 f32
64-bit i64 u64 f64
128-bit i128 u128
Arquitectura Cpu 32-64 isize usize

Estructuras de control

  while contador < 5 {
      Bloque de codigo
  }

  for numero in 0..5 {
      Bloque de codigo
  }

  if numero < 0 {
  	  println!("El número es negativo");
  } else if{
      bloque de codigo
  }

  loop {   //Bucle Loop (Bucle infinito):   //tiene un version con tags, cuando anidas varios loops cual queres que termine "'lopardo: loop" y "break 'lopardo"
      println!("Contador: {}", contador);
	  contador += 1;

	  if contador >= 5 {
	     break; // Termina el bucle cuando el contador es mayor o igual a 5
	  }
  }

  //if con declaracion let
  let num:i32 = 5;
  let condicion_booleana: bool = num > 0;
  let data:i32 = if condicion_booleana{20}else{0};
  println!("{}", data); //20

  //MATCH
  let number = 10;
  match number {
      3 => println!("es tres o hace algo porque es 3"),
      7 => println!("es siete o hace algo porque es 7"),
      other => println!("hace algo porque porque no es 3 ni 7"), //si no es el buscado hace esto
  }
    //con place holder
    let number = 10;
    match number {
    3 => println!("es tres o hace algo porque es 3"),
    7 => println!("es siete o hace algo porque es 7"),
    _ => println!("hace algo porque porque no es 3 ni 7"), //si no es el buscado hace esto
    //_ => (), //si no es el buscado no hace nada
    }

Estructuras de datos

  fn main(){
      //tupla
      let mut tupla : (String,f32,u8) = (String::from("casa"),1.0,6);
      tupla.0 = "cambio valor" .to_string();
      println!("{}", tupla.0);
      println!("{:?}", tupla);  // {:?}permite imprimir la tupla entera de forma debug (para estructuras datos compuestas)
      let(hola, flotante, entero) = tupla; // DESTRUCTURACION DE LA TUPLA ,ahora "hola" tiene "cambio valor" y cada variable tiene el valor de cada elemento de la tupla
      println!("{:?}", tupla);  //tiraria error porque ya no existe tupla


      //array
      let mut vector: [i32;5] = [1,2,3,4,5];  //[tipo,cantidad] = [elementos]
      vector[0] = 6;
      println!("{:?}", vector); //[6, 2, 3, 4, 5]

  }
  

Ownership y Borrowing

  //Ownership: propiedad de un recurso, solo puede tener un dueño a la vez, "cada variable es dueña de su valor"
  /* 
  "aparece el concepto con los tipos de datos compuestos, como las cadenas de texto y los vectores etc etc."
  1. Cada valor en Rust tiene un dueño.
  2. Solo puede haber un dueño a la vez.
  3. Cuando el dueño queda fuera del alcance, el valor se eliminará.*/

  fn main(){
      let s1 = 10;
      let s2 = s1; //s1 se copia en s2, porque es un tipo primitivo
      println!("{}", s1); // no pasa naty por ser primitivos
  }
  //para que aparesca el concepto de ownership, los tipos no tienen que implementar el trait Copy

  fn main(){
      let s1 = String::from("hola");
      let s2 = s1; //s1 se mueve a s2, s1 ya no es valido.. s2 le roba el valor a s1 y ahora s2 es el dueño... ahora s1 = basura
      println!("{}", s1); //error! s1 ya no es valido
  }
  //aca aparece el conceto de borrowing
  fn main(){
      let s1 = String::from("hola");
      let s2 = &s1; //s2 es una referencia a s1, s2 no es dueño de s1, s2 es un prestamo de s1
      println!("{}", s1); //no pasa nada.. duracion del prestamo: alcance de s1 solo en el main
  }

  Tipos implementan el trait Copy:Todos los enteros
  ● BooleanosPunto flotante
  ● CharTupla que solo tengan los tipos que implementan Copy

Ownership y borrowing: funciones

    //no aplica por ser un tipo de dato q implementa el trait copy
    fn main() {
        let mut dato1= 10;
        mi_funcion(dato1);
        println!("{}", dato1);
    }
    fn mi_funcion(mut data: i32){
        data+=1;
        println!("muestro data en la funcion: {}", data);
    }

    //Los enteros, si o si necesitan ser desreferenciados (se pasa una direccion de memoria)
    fn main() {
        let mut dato1= 10;
        mi_funcion(&mut dato1);
        println!("{}", dato1);
    }
    fn mi_funcion(data: &mut i32){
        *data+=1;
        println!("muestro data en la funcion: {}", data);
    }

    //aca si no le paso una referencia a la funcion, no va saber que es data
    fn main() {
        let dato1= String::from(" Seminario de: ");
        mi_funcion(&dato1);
        println!("{}", dato1);
    }
    fn mi_funcion(data: &String){
        println!("muestro data en la funcion: {}", data);
    }
   

Tiempo de vida

  fn main() {
      let string1 = String::from("Seminario de:");
      let string2 = "Rust!!!";
      let result = mas_largo(string1.as_str(), string2);
      println!("El mas largo es:{}", result);
  }
  fn mas_largo<'a>(x: &'a str, y: &'a str) -> &'a str { //explicito lifetime generico 'a para x e y , para el retorno tambien 'a 
      if x.len() > y.len() {
         x
      } else {
         y
      }
  }
  &i32 // una referencia
  &'a i32 // una referencia con explicito lifetime
  &'a mut i32 // una referencia mutable con explicito lifetime

Tiempo de vida

  use rand::Rng;  //importo biblioteca de numeros aleatorios

  fn main() {
      let mut rng = rand::thread_rng(); // me da un generador de números aleatorios
      let random_number: u32 = rng.gen_range(0..=1); //genero un numero aleatorio entre 0 y 1
      println!("Número aleatorio: {}", random_number);
  }