https://d226lax1qjow5r.cloudfront.net/blog/blogposts/all-i-want-for-christmas-is-ruby-3/blog_ruby-christmas_1200x600.jpg

Tout ce que je veux pour Noël, c'est Ruby 3

Publié le December 17, 2020

Temps de lecture : 5 minutes

Que vous fêtiez Noël ou non, il est difficile de ne pas entendre la chanson classique de Mariah Carey, "All I Want For Christmas Is You", dans les grands magasins, à la radio ou pratiquement partout où vous allez. Pour les passionnés du langage Ruby, cette période de l'année a une toute autre signification, car c'est à Noël que l'on peut s'attendre à une nouvelle version majeure de Ruby. Cette année ne fait pas exception à la règle, et la version majeure prévue pour 2020 est en effet très importante.

Ruby 3 suscite beaucoup d'enthousiasme dans l'univers Ruby et remplit le cœur de chaque Rubyiste de joie et d'impatience. Chez Vonage, nous sommes de grands fans de Ruby. Nous disposons d'une suite complète d'outils open-source que nous avons construits en Ruby, notamment un moteur de rendu des spécifications OpenAPI, un moteur de rendu markdown et un outil de plateforme de développement. Tous ces outils s'ajoutent à notre SDK Ruby Vonage APIs et à notre SDK Ruby Vonage Video API.

En bref : nous aimons Ruby et nous nous réjouissons de la sortie prochaine de Ruby 3.

Qu'est-ce qui nous rend si enthousiastes ? Bien que je ne puisse pas parler au nom des autres rubyistes de l'équipe Vonage Developer Relations (nous avons plusieurs fans de Ruby dans l'équipe !), je peux parler en mon nom propre. Voici quelques-unes des raisons pour lesquelles je suis si enthousiaste à l'idée du 25 décembre cette année :

  • Signatures Ruby (RBS)

  • Acteurs Rubis (Ractors)

  • Plus de correspondances de motifs

Nous allons nous pencher sur chacun d'entre eux.

Signatures Ruby (RBS)

Cela fait plusieurs mois que nous explorons les avantages de l'ajout de la vérification statique des types à nos projets Ruby de Vonage. C'est en février de cette année que nous avons publié la version 6.3.0 du SDK Ruby des API de Vonage, qui intégrait les fonctionnalités de Sorbet dans la bibliothèque pour la première fois. Nous avons décrit dans notre billet de blog à l'époque, les raisons qui nous ont poussés à le faire :

L'introduction de la vérification statique des types dans le SDK Ruby permet d'accroître la confiance dans les appels d'API que vous effectuez avec le SDK, et contribue à la fois à réduire et à identifier les bogues au fur et à mesure qu'ils se produisent.

En d'autres termes, nous pensions à l'époque et pensons toujours qu'en combinant une gestion claire des exceptions, une documentation concise et des types définis pour les méthodes qui enveloppent les appels d'API, nous pouvons réduire la friction liée à l'utilisation du SDK pour créer des applications et des services de communication. Plus la fonctionnalité que vous cherchez à mettre en œuvre est complexe, plus il est probable que vous ayez des paramètres complexes dans votre appel API, et nous voulons que le SDK lui-même vous guide dans la manière d'élaborer cet appel avec succès sans vous cogner la tête contre le mur... trop souvent.

Ruby 3 porte la vérification des types à un tout autre niveau en l'incorporant dans le langage lui-même. Alors que Sorbet nécessitait l'adoption d'une gem externe dans l'application, Ruby supportera désormais les types de manière native. Cela se fera grâce aux signatures Ruby, ou RBS en abrégé. Par exemple, voici à quoi pourrait ressembler une méthode de notre SDK Ruby en utilisant RBS :

def unicode?: (String, text) -> bool
  !Vonage::GSM7.encoded?(text)
end

Cette petite méthode de notre classe SMS vérifie la présence d'un élément true ou false sur un paramètre String sur un paramètre. Ainsi, avec RBS, le paramètre est typé avec sa définition de Stringet la méthode est typée pour retourner un boolreprésentant une valeur booléenne.

La possibilité d'ajouter progressivement la vérification de type à tous nos projets Ruby en utilisant le langage lui-même et non d'autres dépendances externes nous permettra d'obtenir encore plus d'avantages en termes de performance et de stabilité pour nos applications.

Acteurs Rubis (Ractors)

Programmation parallèle thread-safe en Ruby ? Oui, c'est vrai ! Bienvenue dans le merveilleux monde expérimental du Ruby Actor, ou Ractor en abrégé. Les Ractors permettent une exécution concurrente au sein de votre application Ruby. C'est un grand pas en avant pour le langage Ruby en général, avec de nombreux cas d'utilisation potentiels. L'exemple fourni dans la Ruby 3.0 Preview 1 Release Notes le résume 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

Dans l'exemple ci-dessus, nous déterminons si un nombre entier calculé donné est un nombre premier. Le Ractor est initialisé avec un bloc #new et à l'intérieur de ce bloc, nous appelons #receive sur la classe Ractor. La méthode #receive ainsi que sa méthode complémentaire #send est la façon dont les messages sont transmis dans les Ractors. Après avoir invoqué #receivela dernière tâche du bloc #new est d'appeler #prime? sur le numéro reçu par le Ractor.

Le numéro est envoyé au Ractor pour évaluation. Dans cet exemple, deux Ractors sont initialisés, chacun utilisant la méthode #send et transmettant l'objet à envoyer.

La valeur est extraite du Ractor avec la méthode #take ce qui est le cas dans les deux dernières lignes de l'exemple ci-dessus.

Auparavant, vous n'auriez pas pu faire cela en Ruby simultanément, mais maintenant, dans le contexte de l'Acteur Ruby, à la fois r1 et r2 peuvent se produire en tant que deux exécutions thread-safe non bloquantes.

Plus de correspondances de motifs

C'est lors de la sortie de Ruby 2.7 que nous avons enfin pu bénéficier du pattern matching en Ruby. Pour les développeurs qui ont l'expérience d'autres langages qui exploitent largement le pattern matching (Elixir, par exemple), c'était une grande affaire. Qu'est-ce que le pattern matching ? A billet de blog d'Agnieszka Malszkiewicz l'explique succinctement :

L'appariement de motifs est un moyen de spécifier un motif pour nos données et si les données correspondent au motif, nous pouvons les déconstruire en fonction de ce motif.

Angnieszka explique ensuite en détail comment tirer parti du pattern matching en Ruby depuis la version 2.7, avec de nombreux exemples à l'appui. Je vous recommande vivement d'explorer son article.

Le squelette de la recherche de motifs en Ruby ressemble à ceci :

case expression
in pattern
  do something
in pattern
  do something else
else
  otherwise do this
end

Avec Ruby 3, nous avons encore plus de fonctionnalités ajoutées au pattern matching avec l'introduction du pattern find en Ruby. Pour voir comment cela fonctionne, créons un petit exemple.

Il se peut que nous ayons un objet contenant un tableau de plusieurs éléments et que nous souhaitions effectuer une recherche de motifs sur cet objet :

today = {weather: 'Sunny', drinks: [{name: 'Espresso', daily_frequency: 3}, {name: 'Cold Brew', daily_frequency: 2}, day: 'Tuesday']}

Si nous essayons d'effectuer une recherche de motifs à l'intérieur du tableau drinks nous obtiendrions un NoMatchingPatternError. Maintenant, en utilisant le motif de recherche, nous pouvons rechercher des éléments avec plusieurs éléments :

case today
in {weather: 'Sunny', drinks: [*, {name: 'Cold Brew', daily_frequency: frequency}, *], *}
  puts "#{frequency} times a day"
end

# => 2 times a day

Le pattern matching, les Ractors et la vérification de type intégrée ne sont que quelques-unes des nouvelles fonctionnalités et améliorations qui seront apportées à Ruby pendant les fêtes de fin d'année. Qu'attendez-vous avec impatience ? Qu'avez-vous envie d'expérimenter et de construire ? Rejoignez la conversation sur notre Communauté Vonage Slack ou envoyez-moi un message sur sur Twitter.

Si vous êtes curieux d'explorer notre travail avec Ruby, venez jeter un coup d'œil à nos outils open-source construits en Ruby sur GitHub :

Bon codage et bonnes vacances !

Partager:

https://a.storyblok.com/f/270183/384x384/e5480d2945/ben-greenberg.png
Ben GreenbergAnciens de Vonage

Ben est un développeur en seconde carrière qui a auparavant passé une décennie dans les domaines de la formation pour adultes, de l'organisation communautaire et de la gestion d'organisations à but non lucratif. Il a travaillé comme défenseur des développeurs pour Vonage. Il écrit régulièrement sur l'intersection du développement communautaire et de la technologie. Originaire de Californie du Sud et ayant longtemps vécu à New York, Ben réside aujourd'hui près de Tel Aviv, en Israël.