Sentencias condicionales
📚 Teoría sobre if, else y match en Rust
if, else y match en RustRust ofrece dos estructuras de control clave para la toma de decisiones: if-else y match.
✅ if-else
if-elseSe usa para tomar decisiones en función de una condición booleana.
📌 Sintaxis básica:
rustCopiarEditarif condicion {
// Código si la condición es verdadera
} else {
// Código si la condición es falsa
}📌 Ejemplo en Rust:
rustCopiarEditarlet num = 10;
if num > 0 {
println!("El número es positivo");
} else {
println!("El número es negativo");
}📌 Cuándo usar if-else
Cuando se necesita verificar una condición booleana única.
Cuando solo hay dos opciones (
trueofalse).
✅ match
matchSe usa para comparar un valor con múltiples posibles casos, similar a switch en otros lenguajes.
📌 Sintaxis básica:
rustCopiarEditarmatch variable {
valor1 => { /* Código para valor1 */ },
valor2 => { /* Código para valor2 */ },
_ => { /* Código por defecto */ },
}📌 Ejemplo en Rust:
rustCopiarEditarlet rol = "Admin";
match rol {
"Admin" => println!("Acceso total"),
"User" => println!("Acceso limitado"),
"Guest" => println!("Solo lectura"),
_ => println!("Rol no reconocido"),
}📌 Cuándo usar match
Cuando hay varias condiciones posibles.
Cuando se trabaja con enum, strings o patrones complejos.
Código en Soroban
Nos vamos a una ruta donde queramos crear nuestro proyecto y ponemos el siguiente comando:
stellar contract init conditionalStatements --name ConditionalStatementsBorramos el contrato generado en lib.rs y ponemos el siguiente código
#![no_std]
use soroban_sdk::{contract, contractimpl, symbol_short, Env, String, Symbol};
#[contract]
pub struct ConditionalSt;
#[contractimpl]
impl ConditionalSt {
// Función que usa if-else para determinar si un número es positivo o negativo.
pub fn check_number(env: Env, num: i32) -> String {
if num >= 0 {
String::from_str(&env, "Numero positivo")
} else {
String::from_str(&env, "Numero negativo")
}
}
// Función que usa match para asignar permisos según el rol del usuario.
pub fn check_role(env: Env, role: Symbol) -> String {
let admin: Symbol = symbol_short!("Admin");
let user: Symbol = symbol_short!("User");
let guest: Symbol = symbol_short!("Guest");
match role {
admin => String::from_str(&env, "Acceso total"),
user => String::from_str(&env, "Acceso limitado"),
guest => String::from_str(&env, "Solo lectura"),
_ => String::from_str(&env, "Rol no reconocido"),
}
}
}📌 Explicación general del código
Usa
#![no_std], lo que significa que no usa la biblioteca estándar de Rust.Importa módulos de
soroban_sdk, necesarios para escribir contratos inteligentes en Soroban.Define una estructura de contrato llamada
ConditionalSt.Implementa dos funciones clave:
check_number(): Usaif-elsepara verificar si un número es positivo o negativo.check_role(): Usamatchpara asignar permisos según el rol de un usuario.
🛠 Explicación de las Funciones
1️⃣ check_number
pub fn check_number(env: Env, num: i32) -> String {
if num >= 0 {
String::from_str(&env, "Numero positivo")
} else {
String::from_str(&env, "Numero negativo")
}
}Descripción: Determina si un número es positivo o negativo.
Mecanismo:
Recibe un número entero (i32) como entrada.
Emplea una estructura condicional if-else para evaluar el valor de
num.Si
numes mayor o igual a 0, retorna unStringcon el mensaje "Numero positivo".Si
numes negativo, retorna unStringcon el mensaje "Numero negativo".
2️⃣ check_role
pub fn check_role(env: Env, role: Symbol) -> String {
let admin: Symbol = symbol_short!("Admin");
let user: Symbol = symbol_short!("User");
let guest: Symbol = symbol_short!("Guest");
match role {
admin => String::from_str(&env, "Acceso total"),
user => String::from_str(&env, "Acceso limitado"),
guest => String::from_str(&env, "Solo lectura"),
_ => String::from_str(&env, "Rol no reconocido"),
}
}
}Descripción: Asigna permisos según el rol del usuario.
Mecanismo:
Define tres roles fijos utilizando el macro
symbol_short!:Admin
User
Guest
Utiliza una estructura de control match para comparar el
rolerecibido con los roles definidos.Retorna un
Stringcon el permiso correspondiente:"Acceso total" si el rol es Admin.
"Acceso limitado" si el rol es User.
"Solo lectura" si el rol es Guest.
Si el rol no coincide con ninguno de los predefinidos, retorna "Rol no reconocido".
📌 Resumen General Este contrato inteligente demuestra el uso de condicionales y estructuras de control en Soroban. A través de check_number se evalúa la positividad o negatividad de un número, mientras que check_role asigna permisos basándose en roles específicos.
Compilación del contrato
Ejecutamos lo siguiente:
Stellar contract buildDespliegue del contrato
Para Mac y Linux el salto de línea es con el carácter " \" y en Windows con el carácter " ´ "
Reemplaze el simbolo * por el respectivo carácter de salto de linea a su sistema operativo.
stellar contract deploy *
--wasm target/wasm32-unknown-unknown/release/ConditionalStatements.wasm *
--source developer *
--network testnet *
--alias ConditionalStatements
Pruebas del contrato
Para Linux y Mac el salto de línea de la instrucción es con el carácter " \ " para Windows con el carácter " ` "
Función get_length
stellar contract invoke *
--id <CONTRACT_ID> *
--source <Identity> *
--network testnet *
-- *
check_number *
--num 10
Función check_role
stellar contract invoke *
--id <CONTRACT_ID> *
--source <Identity> *
--network testnet *
-- *
check_role *
--role "Admin"
Last updated
Was this helpful?

