Ir al contenido principal

Entradas

Mostrando entradas de febrero, 2025

Rust: un vistazo más (5), importar módulos

En lenguajes como Java, C/C++, Python, etc. podemos añadir módulos externos a nuestros programas. En Rust , también podemos hacerlo. Para ello, crearemos un programa (módulo) de la siguiente forma: modulo.rs pub fn holamundo ( ) { println! ( " { message } " , message="Hola , mundo desde: modulo.rs" ) ; } Para importarlo debemos hacer uso de la keyword `` mod `` seguido con el nombre del módulo a importar. main.rs mod modulo ; fn main ( ) { modulo :: holamundo ( ) ; } Al compilar y ejecutar: $ rustc main.rs $ ./main.exe Tendremos la siguiente salida: Hola , mundo desde: modulo.rs Editemos el programa (modulo.rs) para agregar operaciones con funciones matemáticas: pub fn maths ( ) { println! ( " { message } " , message= "\t Funciones matematicas desde: modulo.rs" ) ; println! ( "Min: { } " , 4f64.min ( 6f64 ) ) ; println! ( "Max: { } " , 4f64.max ( 6f64 ) ) ; ...

Rust: un vistazo más (4), uso de clousures

Un closure (o clausura) es un concepto en lenguajes como JavaScript o Python , y que lenguajes Rust permite implementar. Es la manera en como una función dentro de otra función contenedora puede hacer referencia a las variables después de que la función contenedora ha terminado de ejecutarse. Crearemos un clousure para sumar dos números enteros (de tipo i32 ): let suma_numeros = |x:i32 , y:i32| x + y ; Ahora invocaremos la función: fn main ( ) { // Clousure para sumar dos números enteros (i32) let suma_numeros = |x:i32 , y:i32| x + y ; let m = 34 ; let n = 21 as i32 ; // Invocamos el clousure println! ( "Suma con clousure de { } + { } es { } " , m , n , suma_numeros ( m , n ) ) ; } Salida: Suma con clousure de 34 + 21 es 55 El uso de clousures nos permitirá usar variables externas, lo que no se puede hacer con funciones "clásicas" o estandard. Veamos un ejemplo: fn test_c ( ) { let suma_numero...

Java: uso de var

Una nueva característica de Java (desde la versión 10) es que ahora permite declarar variables sin especificar el tipo. Para eso usaremos la palabra reservada `` var ``. Al usarla el compilador infiere de qué tipo se trata. Tengamos el siguiente caso: var strNumber = " 9065646 " ; var docPdf = new MyPDF ( " Este es un simple documento PDF " ) ; var generatePdf = new GeneratorPDF ( strNumber , docPdf ) ; if ( docPdf instanceof MyPDF ) { System . out . println ( " Se trata de un tipo MyPDF " ) ; } La variable `` strNumber `` será inferida como un tipo String . La variable `` docPdf `` será inferida como tipo MyPDF . Finalmente la variable ``generatePdf `` como tipo GeneratorPDF . Usamos el operador instanceof para validar que la variable (o referencia) `` docPdf `` es de tipo MyPDF . Cabe aclarar que lenguajes como C# ya lo usaban antes. Veamos un ejemplo: var integerNumber = 12 ; var booleanValue = true ; var char = ...

Rust: un vistazo más (3)

En Rust existe una propiedad llamada `` Ownership ``, la cual es: la característica especial que permite a Rust garantizar la seguridad de la memoria sin necesidad de un recolector de basura . Ownership : es el un conjunto de reglas que rigen la forma en que un programa de Rust administra la memoria. Esta característica permite que la memoria se administre a través de un sistema de propiedad con un conjunto de reglas que el compilador verifica. Si se viola alguna de las reglas, el programa no se compilará. Heap, Stack y Garbage collection Heap :  son secciones de memoria que se utilizan para almacenar datos en un programa. Stack : es una estructura simple que se usa para variables locales y llamadas a funciones. Garbage collection : es un recolector de basura, un proceso automático que libera memoria de un programa. Reglas básicas de Ownership Cada valor en Rust tiene un propietario ; si se transfiere la propiedad (move), el propietario anterior pierde acce...

Java: sealed class & interfaces

  El concepto de "clases e interfaces selladas" surge desde la versión Java 15 hasta la 17. Pero, ¿Qué son y para qué sirven las clases e interfaces sealed? Estas construcciones permiten un control más estricto sobre la herencia ( extends ) y la implementación ( implements ), lo que mejora la seguridad, el diseño del código y la claridad en la intención del desarrollador. Clases sealed: Una clase sellada es una clase que restringe qué otras clases pueden extenderla. Esto se logra especificando explícitamente las subclases permitidas mediante la palabra clave permits .    Interfaces sealed: Similar a las clases selladas, una interfaz sellada restringe qué clases o interfaces pueden implementarla o extenderla, también usando permits . Ejemplos de clases sealed public sealed class Vehiculo permits Coche, Moto { // Código de la clase } final class Coche extends Vehiculo { // Código de la clase } final class Moto extends Vehiculo { /...

Java: clases record

Las clases `` record `` son una implementación de las data-clases o del patrón Data Transfer Object , un tipo de clase cuyo único propósito es impulsar la programación con datos inmutables. Son clases que se usan para almacenar valores y poder agruparlos en un único identificador. A diferencia de una clase normal, el `` record `` es inmutable. Además que automáticamente genera métodos como equals(), hashCode() y toString(). Miremos un ejemplo. Auditor.java package com . mx . inforhomex ; /** * * @author Alquimista de código * */ public record Auditor { } Modificamos la clase `` record `` agregando tres campos: nombre de tipo String .  fchreg de tipo LocalDate .  horreg de tipo LocalTime . Clase `` record `` modificada: package com . mx . inforhomex ; import java . time . LocalDate ; import java . time . LocalTime ; /** * * @author Alquimista de código * */ public record Auditor(String nombre, LocalDate fchreg, LocalTime horreg) {...