Enero 06, 2024
Ruby
rubyComencemos por el hecho que es un lenguaje completamente orientado a objetos, liberado en 1995. Es un lenguaje dinámico y de código abierto enfocado en la simplicidad y productividad, de allí que sea de las opciones para desarrollo de Startups y de sistemas y/o aplicaciones que se requieren lanzar en corto tiempo.
Está inspirado en los lenguajes favoritos de su creador (Yukihiro “Matz” Matsumoto), Perl, Smaltalk, Eiffel, Ada y Lisp. Esto para crear un lenguaje que incorpora programación funcional e imperativa.
En Ruby, cada valor es un objeto, se le puede asignar propiedades y acciones a toda información y código, desde simples números y los valores de ‘true’, ‘false’, y ‘nil’ (‘nil’ es un valor especial que indica la ausencia de valor, es la versión Ruby de ‘null’). Vamos a invocar a el método llamado ‘class’ de estos valores.
1.class # => Fixnum: el número 1 es un Fixnum
1.0.class # => Float: Los números de punto flotante tienen la clase Float
true.class # => TrueClass: esta es la instancia singleton de TrueClass
false.class # => FalseClass
nil.class # => NilClass
En Ruby, los comentarios comienzan con el símbolo “#”, y el símbolo de flecha “=>” indica el valor que retorna el código comentado (esta es una convención que utilizaremos en los posts futuros).
En muchos lenguajes, las funciones y los métodos invocados requieren de paréntesis, pero en Ruby no, estos son opcionales y comúnmente son omitidos, especialmente cuando el método invocado no tiene argumentos.
Entre las características que hacen a Ruby único están:
-
Sintaxis: Tiene una sintaxis simple y elegante. La sintaxis de Ruby permite reducir líneas de código. Por ejemplo, en lugar de escribir
if x > 5 then ... else ... end
puedes usar en una sola línea
if x > 5; then ... else ... end
Otra forma interesante es utilizar el operador ternario?:
que devuelve el primer argumento si su condición es verdadera, y el segundo argumento si es falso. -
Interpretado: Ruby es interpretado en tiempo real (interpreta mientras se ejecuta). Esto significa que cada vez que se ejecuta un bloque de código, este es analizado y traducido al código máquina justo antes de ejecutarse. La interpretación implica una cierta cantidad de overhead, pero ofrece flexibilidad y facilidad de desarrollo. Por otro lado, los lenguajes compilados generan código máquina directamente desde el texto fuente, lo cual puede hacer la ejecución más rápida pero también limita la flexibilidad ya que todo debe estar definido al momento de la compilación.
-
Tipado: No tiene tipado estático ni compilación previa. Las variables no son nombres simples sino "identificadores", los cuales pueden ser asignados a cualquier cosa, incluso valores inapropiados o nulos (nil). El lenguaje permite operar con ellos sin tener que declarar su tipo antes. En otros lenguajes se requiere indicar el tipo de dato de una variable, por lo cual si intentamos usar una variable como si fuera del tipo declarado recibimos un error. Sin embargo, Ruby permite esto y solo lo notificará cuando sea realmente necesario.
-
Concurrencia: Ruby fue uno de los primeros lenguajes a implementar concurrencia completa en sus versiones principales. A diferencia de otros lenguajes que utilizan hilos lightweight (como Perl), Ruby ofrece verdaderos procesos separados entre sí, lo que les da una mayor capacidad de simultaneidad.
-
Portabilidad: Es posible escribir aplicaciones multiplataforma en Ruby gracias a su framework (minimalista) Rack, que proporciona una capa de abstracción entre las diversas plataformas soportadas. De esta manera, una misma aplicación web podría correr en múltiples servidores sin necesidad de reescribirla.
-
Programación Funcional: Ruby cuenta con buenas herramientas para la programación funcional. Algunas características clave de la programación funcional en Ruby incluyen:
-
Lazy Evaluation: Permite evaluar expresiones solo cuando se requieren sus resultados, en lugar de calcularlos todos de antemano. Esto reduce el consumo de recursos y mejora el rendimiento en situaciones donde se espera grandes conjuntos de datos.
-
Closures: Son funciones que capturan el entorno en el que se crearon, permitiendo acceder a variables externas incluso después de que estas hayan desaparecido.
-
Higher Order Functions: Son funciones que pueden ser pasadas como argumentos o devuelto como resultado de otras funciones. Esto permite construir estructuras de datos complejas y realizar operaciones sobre ellas de manera sencilla y legible.
-
-
Modificadores de acceso: En Ruby existen dos tipos de modificadores de acceso para los atributos de una clase: `attr_accessor` y `attr_reader`. Estos permiten leer (`get`) y escribir (`set`) el valor de una variable sin necesidad de definirlos explícitamente.
-
Metaprogramación: Permite alterar el comportamiento de una clase o objeto mediante programación dinámica. Por ejemplo, podés agregar un nuevo método a cualquier clase con `class << obj .define_method(:foo) { puts 'Hola' }`
-
Módulos vs Clases: En Ruby los módulos (modules) pueden incluirse en otras clases o módulos, mientras que las clases heredadas pueden ser extendidas con otros módulos.
-
Cadena de Herencia: Casi TODO en Ruby es un objeto (including Object itself)
-
Bloques anónimos: Son bloques de código que pueden ser pasados como parámetros a otros métodos. Se definen entre dobles llaves `{ }`. Puedes asignarlos a una variable y luego llamar al bloque.
-
Librerías y Frameworks: Cuenta con una gran cantidad de librerías y frameworks para diferentes tareas, que abarcan una amplia gama de aplicaciones, desde desarrollo web hasta procesamiento de datos, y automatización de tareas. Entre ellas:
-
Ruby on Rails (Rails): Framework de desarrollo web completo y altamente opinionado. Es conocido por su énfasis en la convención sobre la configuración, facilitando el desarrollo rápido y la creación de aplicaciones robustas.
-
Sinatra: Un framework web ligero y flexible que se utiliza para construir aplicaciones web pequeñas y rápidas. Es minimalista y permite a los desarrolladores tener un mayor control sobre la estructura de su aplicación.
-
Hanami: Un framework modular para construir aplicaciones web. Proporciona una arquitectura modular, promoviendo el uso de componentes independientes.
-
Capybara: Biblioteca utilizada para realizar pruebas de integración en aplicaciones web. Permite simular interacciones del usuario con la aplicación y verificar el comportamiento esperado.
-
Bridgetown: Un framework de aplicaciones web estático para Ruby, que se basa en Jekyll y utiliza Liquid como lenguaje de plantillas. Es adecuado para proyectos pequeños o medianos, pero también puede ser utilizado para sitios más grandes.
-
Rake: Herramienta de automatización de tareas similar a Make en otros lenguajes. Se utiliza comúnmente para definir y ejecutar tareas en proyectos Ruby.
-
RSpec: Framework de prueba para Ruby que sigue el estilo de desarrollo conducido por el comportamiento y desarrollo guiado por pruebas(BDD / TDD). Proporciona estructuras claras y expresivas para escribir especificaciones y pruebas.
-
ActiveRecord: Parte integral de Ruby on Rails, ActiveRecord es una biblioteca ORM (Object-Relational Mapping) que facilita la interacción con bases de datos relacionales.
-
Sidekiq: Un marco para el procesamiento de trabajos en segundo plano. Se utiliza comúnmente para gestionar tareas asíncronas, como el envío de correos electrónicos o la generación de informes.
-
Devise: Una gema para la autenticación de usuarios en aplicaciones Rails. Proporciona funcionalidades comunes, como registro, inicio de sesión y recuperación de contraseñas.
-
Nokogiri: Biblioteca para el análisis y manipulación de documentos XML y HTML. Es ampliamente utilizado en aplicaciones que necesitan extraer información de páginas web.
-
-
Desarrollo Ágil: Ruby ha sido ampliamente utilizado en proyect desarrollados de forma ágil, debido a su capacidad para adaptarse rápidamente a cambios en el proyecto y a su comunidad activa y dinámica.
En resumen, Ruby es un lenguaje interesante y potente, pero debe ser usado adecuadamente dependiendo del objetivo del desarrollador. Si está buscando un lenguaje fácil de aprender y usar para proyectos pequeños o prototipos, Ruby podría ser una excelente opción. Sin embargo, si está trabajando en proyectos más grandes o requiere una mayor complejidad, otros lenguajes como Java o C# pueden ser una mejor elección.
Iremos adentrándonos en cada uno de los conceptos en los siguientes posts.
¡Saludos!