
Compartir:
Ben es un desarrollador de segunda carrera que anteriormente pasó una década en los campos de la educación de adultos, la organización comunitaria y la gestión de organizaciones sin ánimo de lucro. Trabajó como defensor de los desarrolladores para Vonage. Escribe regularmente sobre la intersección entre el desarrollo comunitario y la tecnología. Originario del sur de California y residente durante mucho tiempo en Nueva York, Ben reside ahora cerca de Tel Aviv (Israel).
Todo lo que quiero para Navidad es Ruby 3
Tanto si celebras la Navidad como si no, es difícil no ver la clásica canción de Mariah Carey, "All I Want For Christmas Is You", sonando en los grandes almacenes, en la radio o prácticamente en cualquier lugar al que vayas. Para los entusiastas del lenguaje Ruby, esta época del año tiene un significado totalmente distinto, porque en Navidad es cuando podemos esperar una nueva versión importante de Ruby. Este año no es una excepción, y la versión principal para 2020 es bastante importante.
Ruby 3 está causando mucha expectación en todo el universo Ruby y llenando el corazón de todos los Rubyistas de alegría y ansiosa anticipación. En Vonage, somos grandes fans de Ruby. Tenemos un conjunto completo de herramientas de código abierto que hemos construido en Ruby, incluyendo un renderizador de especificaciones OpenAPI, un renderizador markdown y una herramienta de plataforma para desarrolladores. Todas estas herramientas se suman a nuestro Vonage APIs Ruby SDK y a nuestro Vonage Video API Ruby SDK.
En resumen: nos encanta Ruby y estamos entusiasmados con el próximo lanzamiento de Ruby 3.
¿Por qué estamos tan emocionados? Si bien no puedo hablar por los demás rubyistas del equipo de relaciones con los desarrolladores de Vonage (¡tenemos varios fanáticos de Ruby en el equipo!), puedo hablar por mí mismo. Algunas de las razones por las que estoy tan entusiasmado con el 25 de diciembre de este año son:
Firmas Ruby (RBS)
Actores de Rubí (Ractors)
Más coincidencias de patrones
Profundicemos en cada uno de ellos.
Firmas Ruby (RBS)
Llevamos muchos meses explorando las ventajas de añadir la comprobación estática de tipos a nuestros proyectos Ruby de Vonage. Fue en febrero de este año que lanzamos la versión 6.3.0 del SDK Ruby de las APIs de Vonage que incorporaba Sorbet en la biblioteca por primera vez. Describimos en nuestro blog en ese entonces cuál era nuestro razonamiento para hacerlo:
La introducción de la comprobación estática de tipos en el SDK de Ruby sirve para aumentar la confianza en las llamadas a la API que se realizan con el SDK, y ayuda tanto a disminuir como a identificar los errores a medida que se producen.
En otras palabras, creíamos entonces y seguimos creyendo ahora que con una combinación de gestión de excepciones clara, documentación concisa y tipos definidos para los métodos que envuelven las llamadas a la API, podemos reducir la fricción a la hora de utilizar el SDK para crear aplicaciones y servicios de comunicaciones. Cuanto más compleja sea la función que está trabajando para implementar, más probable es que tenga parámetros complejos en su llamada a la API, y queremos que el propio SDK le guíe en la forma de elaborar esa llamada con éxito sin golpearse la cabeza contra la pared ... demasiadas veces.
Ruby 3 lleva la comprobación de tipos a un nivel completamente nuevo al incorporarla directamente en el propio lenguaje. Mientras que Sorbet requería adoptar una gema externa en la aplicación, ahora Ruby soportará tipos de forma nativa. Esto se logrará con Ruby Signatures, o RBS para abreviar. Por ejemplo, esto es lo que un método de nuestro Ruby SDK podría parecer usando RBS:
def unicode?: (String, text) -> bool
!Vonage::GSM7.encoded?(text)
end
Este pequeño método de nuestra clase SMS comprueba si existe una variable true o false en un parámetro String parámetro. Así, con RBS, el parámetro se escribe con su definición de Stringy el método devuelve un valor boolque representa un valor booleano.
La posibilidad de añadir progresivamente la comprobación de tipos a todos nuestros proyectos Ruby utilizando el propio lenguaje y no otras dependencias externas nos permitirá conseguir aún más ventajas de rendimiento y estabilidad para nuestras aplicaciones.
Actores de Rubí (Ractors)
¿Programación paralela a prueba de hilos en Ruby? Sí, ¡es cierto! Bienvenido al nuevo y maravilloso mundo experimental del Ruby Actor, o Ractor para abreviar. Los Ractores permiten la ejecución concurrente dentro de tu aplicación Ruby. Este es un gran paso para el lenguaje Ruby en general, y uno con muchos casos de uso potenciales. El ejemplo provisto en la Ruby 3.0 Preview 1 Release Notes lo resume muy bien:
require 'prime'
# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
Ractor.new do
n = Ractor.receive
n.prime?
end
end
# send parameters
r1.send 2**61 - 1
r2.send 2**61 + 15
# wait for the results of expr1, expr2
puts r1.take #=> true
puts r2.take #=> true
En el ejemplo anterior, estamos determinando si un número entero calculado dado es un número primo. El Ractor se inicializa con un bloque #new y dentro del bloque llamamos a #receive en la clase Ractor. El método #receive junto con su método complementario #send es la forma en que se transmiten los mensajes en los Ractores. Después de invocar #receivela tarea final del bloque #new es llamar a #prime? sobre el número que recibe el Ractor.
El número se envía para su evaluación al Ractor. En este ejemplo, hay dos Ractores inicializados, cada uno utilizando el método #send y pasando el objeto que se va a enviar.
El valor se extrae del Ractor con el método #take que es lo que ocurre en las dos últimas líneas del ejemplo anterior.
Anteriormente, no habrías podido hacer esto en Ruby de forma concurrente, pero ahora en el contexto del Actor Ruby, tanto r1 y r2 pueden ocurrir como dos ejecuciones no bloqueantes a prueba de hilos.
Más coincidencias de patrones
Fue en la versión Ruby 2.7 cuando por fin se nos concedió la concordancia de patrones en Ruby. Para los desarrolladores que han tenido experiencia con otros lenguajes que aprovechan la concordancia de patrones en gran medida (Elixir, por ejemplo), esto fue una gran cosa. ¿Qué es la concordancia de patrones? A entrada de blog de Agnieszka Malszkiewicz lo explica sucintamente:
La concordancia de patrones es una forma de especificar un patrón para nuestros datos y, si los datos coinciden con el patrón, podemos deconstruirlos de acuerdo con este patrón.
Angnieszka amplía en gran detalle cómo aprovechar la concordancia de patrones en Ruby desde la versión 2.7 con montones y montones de ejemplos. Recomiendo encarecidamente explorar su post.
El esqueleto de la concordancia de patrones en Ruby tiene este aspecto:
case expression
in pattern
do something
in pattern
do something else
else
otherwise do this
endCon Ruby 3, tenemos aún más funcionalidad añadida a la concordancia de patrones con la introducción del patrón find en Ruby. Para ver cómo funciona, vamos a crear un pequeño ejemplo.
Tal vez tenemos un objeto que tiene una matriz de múltiples elementos en su interior, y queremos coincidencia de patrón en contra de ella:
today = {weather: 'Sunny', drinks: [{name: 'Espresso', daily_frequency: 3}, {name: 'Cold Brew', daily_frequency: 2}, day: 'Tuesday']}Si intentáramos buscar algo dentro de la matriz drinks devolveríamos un NoMatchingPatternError. Ahora, utilizando el patrón find, podemos buscar elementos con múltiples elementos:
case today
in {weather: 'Sunny', drinks: [*, {name: 'Cold Brew', daily_frequency: frequency}, *], *}
puts "#{frequency} times a day"
end
# => 2 times a day
La concordancia de patrones, los Ractors y la comprobación de tipos integrada son sólo algunas de las increíbles nuevas funciones y mejoras que llegarán a Ruby estas Navidades. ¿Por qué estás tan emocionado? ¿Con qué estás deseando experimentar y construir? Únete a la conversación en nuestro Slack de la comunidad de Vonage o envíame un mensaje a Twitter.
Si tienes curiosidad por explorar nuestro trabajo con Ruby, ven y echa un vistazo a nuestras herramientas de código abierto creadas en Ruby en GitHub:
¡Feliz codificación y felices fiestas!
Compartir:
Ben es un desarrollador de segunda carrera que anteriormente pasó una década en los campos de la educación de adultos, la organización comunitaria y la gestión de organizaciones sin ánimo de lucro. Trabajó como defensor de los desarrolladores para Vonage. Escribe regularmente sobre la intersección entre el desarrollo comunitario y la tecnología. Originario del sur de California y residente durante mucho tiempo en Nueva York, Ben reside ahora cerca de Tel Aviv (Israel).