Rust Basic Syntax Flashcards
Objetivos de Rust
velocidad, seguridad y concurrencia
Seguridad en Rust
● Prevenir el acceso a datos/memoria inválida, en tiempo de compilación (memory
safe sin costo en tiempo de ejecución) (buffer overflow).
● No existen los “punteros sueltos’’ (dangling pointers), las referencias a datos
inválidos son descartadas.
● Previene condiciones de carrera sobre los datos al usar concurrencia.
Productividad en Rust
● ayudas del compilador, tipos de datos sofisticados, pattern matching, etc.
● Herramienta de construcción incorporada con gran biblioteca de paquetes (cargo)
Hola Mundo!
fn main() {
println!(“hola mundo!”);
}
Tipos de datos
Primitivos
● i8, i16, i32, i64
● u8, u16, u32, u64
● f32, f64
● usize, isize (depende del target)
● bool (1 byte)
● char (Unicode - 4 bytes)
Arrays
● [u8; 3]
● Slices: arr[3..5]
Tuplas
● (char, u8, i32)
Dinámicos std lib
● Vec<T>, Option<T>
● String</T></T>
Variables syntax
// Las variables son inmutables por default
let t = true;
// Para hacerlas mutables usamos mut
let mut punto = (1_u8, 2_u8);
punto = (4, 3);
// Los tipos pueden ser inferidos como en los ejemplos anteriores,
// o explícitos. La asignación se denomina “binding”
let numero: i32 = 42;
Funciones syntax
fn sumar_uno(a: i32) −> i32 {
a + 1
}
// Closure
let plus_one = |a| { a + 1 }
// Closure como parámetro
fn map42(mapper:fn(i32) -> i32) -> i32 {
mapper(42)
}
Structs syntax
// Campos con nombre
#[derive(Debug)]
struct Persona {
nombre: String,
apellido: String
}
// O posicionales
struct NumeroImaginario(f64, f64);
What exactly does ‘#[derive(Debug)]’ mean in Rust?
[…] is an attribute on struct Person. derive(Debug) asks the compiler to auto-generate a suitable implementation of the Debug trait, which provides the result of {:?} in something like format!(“Would the real {:?} please stand up!”, Person { name: “John”, age: 8 });.
Structs - Métodos syntax
impl NumeroImaginario {
// “Método estático”
fn new(r:f64, i:f64) -> NumeroImaginario {
NumeroImaginario(r, i)
}
fn modulo(&self) -> f64 {
(self.0self.0 + self.1self.1).sqrt()
}
}
Traits syntax
trait MagnitudVectorial {
fn norma(&self) -> f64;
}
impl MagnitudVectorial for NumeroImaginario {
fn norma(&self) -> f64 {
self.modulo()
}
}
fn max(v1:&MagnitudVectorial, v2:&MagnitudVectorial) -> f64 {
v1.norma().max(v2.norma())
}
Enums syntax
enum Palo {
Oro,
Copa,
Espada,
Basto,
}
let palo: Palo = Palo::Oro;
Complex enums syntax
enum Message {
Fire,
Move { x: i32, y: i32 },
Say(String),
}
enum con
enum Message {
Fire,
Move { x: i32, y: i32 },
Say(String),
}
Pattern Matching syntax
fn print_message(m:Message) {
match m {
Message::Fire => println!(“Fire”),
Message::Move{ x:_, y} if y > 10 => println!(“Corre hacia arriba”),
Message::Move{ x, y} => println!(“Se mueve hacia {}, {}”, x, y),
Message::Say(msg) => println!(“Dice: {}”, msg),
};
}