curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
rustc --version
cargo new nombre_proyecto
nombre_proyecto/
├── Cargo.toml
└── src
└── main.rs
cargo build
cargo build
cargo run
fn main() {
println!("Bitcoin: A Peer-to-Peer Electronic Cash System");
}
let x: i32 = 5; // Entero con signo
let y: f64 = 3.14; // Flotante de 64 bits
let z: char = 'Z'; // Carácter
let flag: bool = true; // Booleano
let tuple: (i32, f64, bool) = (500, 6.4, true); // Tupla
let array: [i32; 3] = [1, 2, 3]; // Array
fn print(item: T) {
println!("{:?}", item);
}
fn sum>(a: T, b: T) -> T {
a + b
}
fn main() {
let sats = 10000;
if sats < 5000 {
println!("Lower than 5000");
} else if sats == 5000 {
println!("Equals than 5000");
} else {
println!("Greater than 5000");
}
}
fn main() {
let sats = 10000;
match sats {
10000 => println!("10.000 sats, tier one"),
20000 => println!("20.000 sats, tier two"),
30000 => println!("30.000 sats, tier three"),
_ => println!("Other quantity"), // default
}
}
fn sum(a: i32, b: i32) -> i32 {
a + b // Expresión implícita como retorno
}
struct Person {
name: String,
age: u8,
}
fn main() {
let person = Person {
name: String::from("Bob"),
age: 30,
};
println!("{} is {} years old", person.name, person.age);
}
enum CurrencyCode {
BTC,
SAT
}
fn main() {
let currency_code = CurrencyCode::BTC;
match currency_code {
CurrencyCode::BTC=> println!("Given in bitcoin"),
CurrencyCode::SAT=> println!("Given in satoshis"),
}
}
trait Describible {
fn description(&self) -> String;
}
struct Wallet {
brand: String,
model: String,
price_in_sats: u64,
}
impl Describible for Wallet {
fn description(&self) -> String {
format!("The price of the {} {} is {} sats", self.brand, self.model, self.price_in_sats)
}
}
fn main() {
let coldcardQ = Wallet {
brand: String::from("Coinkite"),
model: String::from("Coldcard Q"),
price_in_sats: 408285,
};
println!("{}", coldcardQ.description());
}
fn main() {
let s1 = String::from("Hello");
let s2 = s1; // s1 se mueve a s2, s1 ya no es válido
// println!("{}", s1); // Error: s1 ya no es accesible
println!("{}", s2); // Ok
}
fn print(s: &String) {
println!("{}", s);
}
fn main() {
let s = String::from("Hello");
print(&s); // Pasa una referencia a la función
println!("{}", s); // s sigue siendo válido porque no se movió, solo se prestó
}
fn divide(dividend: i32, divider: i32) -> Option {
if divider == 0 {
None
} else {
Some(dividend / divider)
}
}
fn divide(dividend: i32, divider: i32) -> Result {
if divider == 0 {
Err(String::from("Division by zero"))
} else {
Ok(dividend / divider)
}
}
fn main() {
let some_number = Some(5); // `Some` contiene un valor
let no_number: Option = None; // `None` representa la ausencia de valor
println!("The number is: {:?}", some_number);
println!("There is no number: {:?}", no_number);
}
fn main() {
let some_number = Some(10);
match some_number {
Some(value) => println!("The value is: {}", value),
None => println!("There is no value."),
}
}
fn main() {
let some_number = Some(42);
let no_number: Option = None;
// Usando `unwrap`
println!("The value is: {}", some_number.unwrap()); // Esto funciona ya que es `Some`
// Usando `unwrap_or`
println!("The value is: {}", no_number.unwrap_or(0)); // Retorna 0 ya que es `None`
// Usando `unwrap_or_else`
println!(
"The value is: {}",
no_number.unwrap_or_else(|| {
println!("There is no value, using the default value is");
-1
})
);
}
fn main() {
let number = Some(10);
// `map` aplica una función solo si es `Some`
let new_number = number.map(|x| x * 2);
println!("Duplicate number: {:?}", new_number); // Some(20)
// `and_then` permite encadenar operaciones que también devuelven `Option`
let result = number.and_then(|x| if x > 5 { Some(x * 3) } else { None });
println!("Result: {:?}", result); // Some(30)
}
fn main() {
let result = safe_division(10, 0);
// Usando unwrap: causará un pánico si el resultado es `Err`
// println!("Resultado: {}", result.unwrap()); // Esto daría un error y detendría el programa
// Usando unwrap_or para proporcionar un valor predeterminado
let value = result.unwrap_or(-1);
println!("Result with default value in case of error: {}", value);
}
fn main() {
let result = safe_division(20, 4);
// Usando map para multiplicar el resultado si es `Ok`
let new_result = result.map(|x| x * 2);
println!("Multiplied result: {:?}", new_result); // Ok(10)
// Usando and_then para encadenar operaciones
let final_result = result.and_then(|x| safe_division(x, 2));
println!("Final result after the second operation: {:?}", final_result); // Ok(5)
}
fn division_with_op(a: i32, b: i32) -> Result {
let result = safe_division(a, b)?; // Si safe_division devuelve `Err`, lo retorna de inmediato
Ok(result * 2) // Si todo va bien, multiplica el resultado por 2
}
fn main() {
match division_with_op(10, 0) {
Ok(valor) => println!("Result: {}", valor),
Err(e) => println!("Error: {}", e),
}
}
fn main() {
let vec = vec![1, 2, 3];
println!("The element in position 3 is: {}", vec[3]);
}
fn divide(dividend: i32, divider: i32) -> i32 {
if divider == 0 {
panic!("Error: intento de dividir por cero");
}
dividend / divider
}
fn main() {
let result = divide(10, 0);
println!("Result: {}", result);
}
fn main() {
for i in 0..5 { // Rango de 0 a 4
println!("{}", i);
}
}
fn main() {
let mut x = 0;
while x < 5 {
println!("{}", x);
x += 1;
}
}
fn main() {
let mut count = 0;
loop {
if count == 5 {
break;
}
println!("{}", count);
count += 1;
}
}
let hello = "Hello, world!"; // Es un `&str` en el stack (literal embebido)
let s = String::from("Hello"); // El contenido vive en el heap.
let slice: &str = &s; // slice de un string en el heap.
let mut s = String::from("Hello"); // Vive en el heap y es mutable.
s.push_str(", world!"); // Puedes modificar su contenido.
fn greater<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn print(x: &str) {
println!("{}", x);
}
let s: &'static str = "Este es un literal de string estático";
let closure_name = |param1, param2| -> ReturnType {
// cuerpo de la closure
};
let closure = |x| x + 1; // Closure que toma un número y le suma 1
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let mut iter = numbers.iter(); // Crea un iterador sobre `numbers`
while let Some(num) = iter.next() {
println!("{}", num);
}
}
struct Counter {
count: usize,
}
impl Counter {
fn new() -> Counter {
Counter { count: 0 }
}
}
impl Iterator for Counter {
type Item = usize;
fn next(&mut self) -> Option {
self.count += 1;
if self.count <= 5 {
Some(self.count)
} else {
None
}
}
}
fn main() {
let mut counter = Counter::new();
while let Some(value) = counter.next() {
println!("{}", value); // Imprime: 1, 2, 3, 4, 5
}
}
let numbers = vec![1, 2, 3, 4, 5];
let result = numbers.iter()
.map(|x| x * 2)
.filter(|x| x > 5); // Nada ha pasado todavía
let collected: Vec = result.collect(); // Aquí es donde realmente se ejecutan `map` y `filter`
println!("{:?}", collected); // Imprime: [6, 8, 10]