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

Alles was ich mir zu Weihnachten wünsche ist Ruby 3

Zuletzt aktualisiert am December 17, 2020

Lesedauer: 5 Minuten

Ob Sie nun Weihnachten feiern oder nicht, es ist schwer, den klassischen Song von Mariah Carey, "All I Want For Christmas Is You", zu verpassen, der in Kaufhäusern, im Radio oder praktisch überall, wo Sie hingehen, gespielt wird. Für die Liebhaber der Sprache Ruby hat diese Zeit des Jahres eine ganz andere Bedeutung, denn Weihnachten ist die Zeit, in der wir eine neue größere Version von Ruby erwarten können. Dieses Jahr bildet da keine Ausnahme, und die Hauptversion für 2020 ist in der Tat ziemlich groß.

Ruby 3 sorgt für viel Aufregung im Ruby-Universum und erfüllt das Herz eines jeden Rubyisten mit Freude und Vorfreude. Hier bei Vonage sind wir große Fans von Ruby. Wir haben eine ganze Reihe von Open-Source-Tools, die wir auf Ruby aufgebaut haben, darunter einen OpenAPI-Spezifikations-Renderer, einen Markdown-Renderer und ein Entwicklerplattform-Tool. Alle diese Tools sind zusätzlich zu unserem Vonage APIs Ruby SDK und unserem Vonage Video API Ruby SDK verfügbar.

Kurz gesagt: Wir lieben Ruby, und wir freuen uns riesig auf die bevorstehende Veröffentlichung von Ruby 3.

Was macht uns so aufgeregt? Ich kann zwar nicht für die anderen Rubyisten im Vonage Developer Relations Team sprechen (wir haben mehrere Ruby-Fans im Team!), aber ich kann für mich selbst sprechen. Einige der Gründe, warum ich dieses Jahr so begeistert vom 25. Dezember bin, sind:

  • Ruby Unterschriften (RBS)

  • Rubin-Schauspieler (Ractors)

  • Mehr Mustervergleiche

Schauen wir uns jede einzelne davon an.

Ruby Unterschriften (RBS)

Wir haben die Vorteile des Hinzufügens von statischer Typüberprüfung zu unseren Vonage Ruby-Projekten seit vielen Monaten erforscht. Bereits im Februar dieses Jahres haben wir die Version 6.3.0 des Vonage APIs Ruby SDK veröffentlicht, die Folgendes beinhaltet Sorbet zum ersten Mal in die Bibliothek integriert haben. Wir beschrieben in unserem Blogbeitrag beschrieben, was unsere Beweggründe dafür waren:

Die Einführung der statischen Typprüfung im Ruby SDK erhöht das Vertrauen in die API-Aufrufe, die Sie mit dem SDK tätigen, und trägt dazu bei, Fehler zu verringern und zu identifizieren, sobald sie auftreten.

Mit anderen Worten: Wir glaubten damals und glauben auch heute noch, dass wir mit einer Kombination aus klarer Ausnahmebehandlung, prägnanter Dokumentation und definierten Typen für die Methoden, die die API-Aufrufe umschließen, die Reibungsverluste bei der Verwendung des SDK zur Erstellung von Kommunikationsanwendungen und -diensten verringern können. Je komplexer die Funktion ist, die Sie implementieren möchten, desto wahrscheinlicher ist es, dass Sie komplexe Parameter in Ihrem API-Aufruf haben, und wir möchten, dass das SDK selbst Sie anleitet, wie Sie diesen Aufruf erfolgreich gestalten können, ohne mit dem Kopf gegen die Wand zu stoßen... zu oft.

Ruby 3 hebt die Typprüfung auf eine ganz neue Ebene, indem es sie direkt in die Sprache selbst integriert. Während Sorbet die Integration eines externen Edelsteins in die Anwendung erforderte, wird Ruby jetzt nativ Typen unterstützen. Dies wird mit Ruby Signatures, kurz RBS, erreicht. So könnte zum Beispiel eine Methode aus unserem Ruby SDK mit RBS aussehen:

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

Diese kleine Methode aus unserer SMS-Klasse prüft, ob ein true oder false Wert für einen String Parameter. Bei RBS wird also der Parameter mit seiner Definition von Stringund die Methode ist so typisiert, dass sie einen boolzurückgibt, was einen booleschen Wert darstellt.

Die Möglichkeit, die Typüberprüfung schrittweise in alle unsere Ruby-Projekte einzubauen, indem wir die Sprache selbst und keine anderen externen Abhängigkeiten verwenden, wird es uns ermöglichen, noch mehr Leistungs- und Stabilitätsvorteile für unsere Applikationen zu erzielen.

Rubin-Schauspieler (Ractors)

Parallele, thread-sichere Programmierung in Ruby? Ja, es ist wahr! Willkommen in der wunderbaren neuen experimentellen Welt des Ruby Actor, kurz Ractor genannt. Ractors ermöglichen die parallele Ausführung innerhalb Ihrer Ruby-Anwendung. Dies ist ein wirklich großer Schritt für die Sprache Ruby im Allgemeinen und ein Schritt mit vielen potenziellen Anwendungsfällen. Das Beispiel, das in der Ruby 3.0 Vorschau 1 Release Notes kapselt es gut ein:

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

Im obigen Beispiel soll festgestellt werden, ob eine bestimmte berechnete ganze Zahl eine Primzahl ist. Der Ractor wird mit einem #new Block initialisiert, und innerhalb des Blocks rufen wir #receive für die Klasse Ractor auf. Die Methode #receive Methode, zusammen mit ihrer komplementären #send Methode, wie Nachrichten in Ractors übergeben werden. Nach dem Aufruf von #receivebesteht die letzte Aufgabe im #new Block ist der Aufruf von #prime? auf die vom Ractor empfangene Nummer.

Die Zahl wird zur Auswertung an den Ractor gesendet. In diesem Beispiel werden zwei Ractors initialisiert, die jeweils die Methode #send Methode verwenden und das zu sendende Objekt übergeben.

Der Wert wird aus dem Ractor mit der #take Methode extrahiert, was in den letzten beiden Zeilen des obigen Beispiels geschieht.

Bisher war es in Ruby nicht möglich, dies gleichzeitig zu tun, aber jetzt können im Kontext des Ruby-Actors sowohl r1 und r2 als zwei nicht-blockierende, thread-sichere Ausführungen stattfinden können.

Mehr Mustervergleiche

Mit der Veröffentlichung von Ruby 2.7 wurde uns endlich Pattern Matching in Ruby gewährt. Für Entwickler, die bereits Erfahrung mit anderen Sprachen haben, die Pattern-Matching in hohem Maße nutzen (z. B. Elixir), war dies eine große Sache. Was ist Pattern Matching? A Blogbeitrag von Agnieszka Malszkiewicz erklärt es kurz und bündig:

Der Musterabgleich ist eine Möglichkeit, ein Muster für unsere Daten festzulegen, und wenn die Daten mit dem Muster übereinstimmen, können wir sie entsprechend diesem Muster dekonstruieren.

Angnieszka geht sehr detailliert darauf ein, wie man die Vorteile von Pattern Matching in Ruby seit Version 2.7 nutzen kann, mit vielen, vielen Beispielen. Ich empfehle sehr, ihren Beitrag zu lesen.

Das Grundgerüst des Mustervergleichs in Ruby sieht folgendermaßen aus:

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

Mit Ruby 3 wurde die Funktionalität des Musterabgleichs durch die Einführung des Find-Musters in Ruby noch erweitert. Um zu sehen, wie es funktioniert, lassen Sie uns ein kleines Beispiel erstellen.

Vielleicht haben wir ein Objekt, das ein Array mit mehreren Elementen enthält, und wir möchten einen Mustervergleich durchführen:

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

Wenn wir versuchen würden, einen Mustervergleich für etwas innerhalb des drinks Array zu finden, würden wir ein NoMatchingPatternError. Mit Hilfe des Suchmusters können wir nun Elemente mit mehreren Elementen abgleichen:

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

# => 2 times a day

Pattern Matching, Ractors und integrierte Typprüfung sind nur einige der erstaunlichen neuen Funktionen und Verbesserungen, die in dieser Weihnachtszeit in Ruby kommen. Worauf freuen Sie sich? Worauf freuen Sie sich schon, um damit zu experimentieren und zu bauen? Beteiligen Sie sich an der Diskussion auf unserem Vonage Community Slack oder schick mir eine Nachricht auf Twitter.

Wenn Sie neugierig auf unsere Arbeit mit Ruby sind, schauen Sie sich unsere Open-Source-Tools in Ruby auf GitHub an:

Viel Spaß beim Programmieren und schöne Feiertage!

Teilen Sie:

https://a.storyblok.com/f/270183/384x384/e5480d2945/ben-greenberg.png
Ben GreenbergVonage Ehemalige

Ben ist ein Entwickler im zweiten Beruf, der zuvor ein Jahrzehnt in den Bereichen Erwachsenenbildung, Community-Organisation und Non-Profit-Management tätig war. Er arbeitete als Anwalt für Entwickler bei Vonage. Er schreibt regelmäßig über die Überschneidung von Gemeindeentwicklung und Technologie. Ursprünglich aus Südkalifornien stammend und lange Zeit in New York City ansässig, wohnt Ben jetzt in der Nähe von Tel Aviv, Israel.