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-else
Se 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 (
true
ofalse
).
✅ match
match
Se 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 ConditionalStatements
Borramos 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-else
para verificar si un número es positivo o negativo.check_role()
: Usamatch
para 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
num
es mayor o igual a 0, retorna unString
con el mensaje "Numero positivo".Si
num
es negativo, retorna unString
con 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
role
recibido con los roles definidos.Retorna un
String
con 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 build
Despliegue 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?