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

オール・アイ・ウォント・フォー・クリスマス・イズ・ルビー3

最終更新日 December 17, 2020

所要時間:1 分

クリスマスを祝う人もそうでない人も、マライア・キャリーの名曲 "All I Want For Christmas Is You "をデパートやラジオなど、どこに行っても耳にするようになった。というのも、クリスマスはRubyの新しいメジャーリリースが期待できる時期だからだ。今年も例外ではなく、2020年のメジャーリリースは実に大きなものだ。

Ruby 3はRuby界全体に興奮をもたらし、すべてのRubyistの心を喜びと期待で満たしています。ここVonageでは、私たちはRubyの大ファンです。私たちは、OpenAPI仕様レンダラー、マークダウン・レンダラー、開発者プラットフォーム・ツールなど、Rubyで構築したオープンソースのツール一式を持っています。これらのツールはすべて、私たちのVonage API Ruby SDKと私たちのVonage Video API Ruby SDKに加えています。

要するに、私たちはRubyが大好きで、Ruby 3のリリースを心待ちにしているのだ。

何がそんなに私たちを興奮させるのでしょうか?Vonage Developer Relations チームの他の Rubyist (チームには何人か Ruby ファンがいます!) の代弁はできませんが、私自身の代弁はできます。私が今年の12月25日をとても楽しみにしている理由はいくつかあります:

  • ルビー署名(RBS)

  • ルビー・アクターズ(Ractors)

  • その他のパターンマッチング

では、そのひとつひとつを紹介していこう。

ルビー署名(RBS)

VonageのRubyプロジェクトに静的型チェックを追加することの利点を、私たちは何ヶ月も前から探ってきました。今年の2月にVonage APIs Ruby SDKのバージョン6.3.0をリリースし、その中に以下を組み込みました。 ソルベを初めてライブラリに組み込んだ。私たちは ブログ投稿で説明しました:

Ruby SDKの静的型チェックの導入は、SDKを使ったAPI呼び出しの信頼性を高め、バグを減らし、発生したバグを特定するのに役立ちます。

言い換えれば、明確な例外処理、簡潔なドキュメント、APIコールをラップするメソッドの定義された型を組み合わせることで、SDKを使用して通信アプリやサービスを構築する際の摩擦を減らすことができると、私たちは当時も今も信じています。実装しようとしている機能が複雑であればあるほど、APIコールに複雑なパラメータが含まれる可能性が高くなります。私たちは、SDK自体が、壁に何度も頭をぶつけることなく、うまくコールを作成する方法をガイドしてくれることを望んでいます。

Ruby 3では、型チェックを言語そのものに組み込むことで、まったく新しいレベルに到達した。Sorbetではアプリケーションに外部gemを採用する必要があったが、Rubyではネイティブに型がサポートされる。これはRuby Signatures、略してRBSによって実現される。例えば、Ruby SDKのメソッドがRBSを使うとこのようになります:

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

SMS クラスのこの小さなメソッドは trueまたは false値をチェックします。 Stringパラメータの値をチェックする。したがって、RBSでは、パラメータは Stringを返すように型付けされます。 boolを返すように型付けされます。

外部の依存関係ではなく、言語そのものを使用して、すべてのRubyプロジェクトにインクリメンタルに型チェックを追加することができるため、アプリケーションのパフォーマンスと安定性がさらに向上します。

ルビー・アクターズ(Ractors)

Rubyで並列スレッドセーフ・プログラミング?はい、本当です!Rubyアクター、略してRactorの素晴らしい新しい実験的世界へようこそ。RactorはRubyアプリケーション内での並列実行を可能にします。これはRuby言語全般にとって本当に大きな一歩であり、多くの潜在的なユースケースを持つものです。で提供されているサンプルは Ruby 3.0 プレビュー 1 リリースノートに記載されている例がそれをよく表しています:

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

上記の例では、計算された整数が素数かどうかを判定しています。Ractorは #newブロックで初期化され、ブロック内で #receiveを呼び出します。メソッド #receiveメソッドは、その補完的な #sendメソッドは、Ractorsでメッセージが渡される方法です。を呼び出した後 #receiveを呼び出した後、 #newブロックの最後のタスクは #prime?を呼び出すことである。

この数値はラクターに送られ、評価される。この例では、2つのRactorが初期化され、それぞれが #sendメソッドを使用し、送信されるオブジェクトを渡します。

メソッドでRactorから値を抽出します。 #takeメソッドでRactorから値を取り出す。

以前は、Rubyでこれを同時に行うことはできなかった。 r1r2を2つのノンブロッキング・スレッドセーフな実行として実現できるようになった。

その他のパターンマッチング

Ruby 2.7のリリースで、ついにRubyにパターン・マッチが導入された。パターン・マッチを大いに活用する他の言語(例えばElixirなど)の経験がある開発者にとって、これは大きな出来事だった。パターン・マッチとは何か?A Agnieszka Malszkiewiczによるブログ記事が簡潔に説明している:

パターンマッチングとは、データのパターンを指定する方法で、データがパターンに一致すれば、そのパターンに従ってデータを分解することができる。

Angnieszkaは、バージョン2.7以降のRubyでパターン・マッチを活用する方法について、たくさんの例を挙げて詳しく説明している。彼女の記事を読むことを強くお勧めする。

Rubyのパターンマッチングの骨格は以下のようになる:

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

Ruby 3では、findパターンが導入され、パターン・マッチにさらに多くの機能が追加されました。どのように機能するのか、小さな例を作ってみよう。

おそらく、その中に複数の要素を持つ配列を持つオブジェクトがあり、それに対してパターン・マッチを行いたいのだろう:

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

配列の中の何かをパターン・マッチしようとすると drinksを返すだろう。 NoMatchingPatternError.ここで、findパターンを利用すれば、複数の要素を持つ項目に対してマッチさせることができる:

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

# => 2 times a day

パターンマッチ、Ractors、そして統合型チェックは、このホリデーシーズンにRubyにやってくる素晴らしい新機能や改良のほんの一部です。あなたは何にワクワクしますか?あなたは何を試して構築するのを楽しみにしていますか?私たちの VonageコミュニティSlackまたは ツイッター.

Rubyを使った私たちの仕事に興味がある方は、ぜひGitHubでRubyで作られたオープンソースのツールをチェックしてみてください:

ハッピー・コーディング、そしてハッピー・ホリデー!

シェア:

https://a.storyblok.com/f/270183/384x384/e5480d2945/ben-greenberg.png
Ben Greenbergヴォネージの卒業生

ベンはセカンドキャリアの開発者で、以前は成人教育、コミュニティ組織化、非営利団体運営の分野で10年を過ごした。彼はVonageの開発者支援者として働いていた。コミュニティ開発とテクノロジーの交差点について定期的に執筆している。南カリフォルニア出身で、長年ニューヨークに住んでいたが、現在はイスラエルのテルアビブ近郊に在住。