LoginSignup
11
4

【Ruby】RubyKaigi2023で興味を持った技術【RBS】

Last updated at Posted at 2023-06-07

はじめに

RubyKaigi2023に先日、オンラインで一部参加させて頂きました。

正直言って自分自身の英語力の弱さと相俟って理解出来てない部分も、多数あったかなと思います。

今回はRubyKaigiで紹介されたスライドを紹介しつつ、初めて聞く単語も多かったので気になったもの新しく調べた内容と共にまとめていきます!

UTF-8 is comming to mruby/c(DAY1)

mruby/cはASCII(バイナリ)のみを使用してきましたが、UTF-8をサポートするようになったとのこと。
mruby/cで利用可能なUTF-8サポートをどのように実装したのかを説明されていました。

そもそもmruby/cって?

以下しまねソフト研究開発センターより引用

mruby/cは、Rubyの特徴を引き継ぎつつ、プログラム実行時に必要なメモリ消費量が従来のmruby(福岡で開発された組込み向けの軽量Ruby)より少ないmrubyの実装です。
国立大学法人九州工業大学(田中和明准教授)と共同で研究開発を行っています。

ざっくり言うと、mrubyという組み込み向けの軽量プログラミング言語をさらにプログラム実行時にメモリ消費量を少なくした軽量タイプです。

Rubyと比較して100分の1の容量で動作するのこと。

内容

従来のmruby/cでは文字列に対して.sizeメソッドを使用した際にbyte列として解釈されてしまう問題がありました。
それにより、

"💎".size # → 1

として出力して欲しいところを、実際は

"💎".size # → 4

として出力されてしまいました。
他にもindex,slice,inspect,oldなどにも問題があるのことでした。

また、💎の絵文字がなぜ4として上記のようになるかというかは下に添付するスライドの44ページ目に説明されております。

プレゼン資料と詳細について

Let's write RBS!(DAY3)

RBSを使用してコーディングについて、デモンストレーションで解説されていました
特にバージョン3.1の新機能であるsubtractparseについて必要な理由と、使用方法について
細かく解説されていました。

そもそもRBSって?

RBSとはRuby3.0で導入されたコードに型を提供する仕組みのことです!
これによってGoJavaのように静的な型付けが出来るようになりました。

これによりコンパイル時にコードの型エラーを検出することができるため、コードの信頼性と保守性を向上させるのにも役立ちます。

実際に書いてみよう

今回はRBSとセットで使用されることの多い、SteepTypeProfを使って書いていきます!
下記の手順で作業を行なっていきます!

1.クラスが定義されているコードを用意
2.1のコードをTypePropfでテンプレートを作成する
3.Steepを使用して型エラーを検出する

というわけで上記を検証するために以下のコマンドを叩いておいてください!

$ gem install typeprof steep

1.クラスが定義されているコードを用意

今回は下記の長方形のクラスファイルを用意します

lib/reactangle.rb
class Rectangle
  attr_reader :width, :height

  def initialize(width:, height:)
    @width = width
    @height = height
  end
  
  def area 
    height * width
  end
end

2.1のコードをTypePropfで実行する

次にTypeProfを使用して、型注釈用のrbsファイルを生成します。

$ typeprof lib/reactangle.rb -o sig/reactangle.rbs

上記のコマンド実行により下記のファイルが作成されます。

sig/user.rbs
# Classes
class Rectangle
  attr_reader width: untyped
  attr_reader height: untyped
  def initialize: (width: untyped, height: untyped) -> void
  def area: -> untyped
end

今回は元ファイルに型定義されいないので、untypedvoidから型を変えてあげます

sig/user.rbs
# Classes
class Rectangle
  attr_reader width: String
  attr_reader height: Integer
  def initialize: (width: Integer, height: Integer) -> void
  def area: -> Integer
end

今回はあえて型エラーを検出するためにあえてwidth:Stringと定義しておきます
これで型を確認するためのRBSファイルは完成です!!

3.Steepを使用して型エラーを検出する

gemは最初にinstallしていると思うので、

$ steep init

を叩くとSteepfileが生成されます。

生成されたファイルを下記のようにに書き換えます!

Steepfile
target :lib do
  check "lib"
  signature "sig"
end

それではSteepを使用してみましょう

$ steep check

を叩くと以下のエラーが出力されるかなと思います

lib/reactangle.rb:5:4: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
...........
lib/reactangle.rb:10:4: [error] Cannot find compatible overloading of method `*` of type `::Integer`
│ Method types:

1つ目のエラーはIntegerStringに割り当てられない、*と互換性のあるIntegerが見つからないよ〜といったものです

width:Integerとして正しい型に修正してみてください。
もう1度 steep checkしてください
すると

$ steep check
................................................................................

No type error detected. 🫖

と出力されエラーがない言葉わかります!

内容

前置きが長くなりました。
今回のプレゼンではrbs subtractrbs parseの説明がされていました。
rbs subtractは複数ファイルでRBS定義が重複している場合は片方を削除してくれる機能

$ rbs substract a.rbs b.rbs # a.rbsからb.rbsの重複したものを差し引いて出力
$ rbs substract --write a.rbs b.rbs # a.rbsからb.rbsの重複したものをa.rbsに上書きする

のように実コマンドと実コードを元にデモンストレーションが行われていました。

rbs parseはファイルをパースしてSyntax Errorがをみつけてくれるものとして説明されておりました。

詳しく内容を知りたい方は以下を閲覧してください!

プレゼン資料と詳細について

最後に

一部ではありますが、オンラインでRubyKaigi2023に参加できて良かったです。
特にRBSについてはとても気になる内容でした。
Rubyにおいても型があるのがマジョリティになってるかもと思うと面白いですよね。
今回はあまり分からない技術慣れない英語でリスニングしたことによって当日すんなり頭に入ってこなかったのかなと思います😵‍💫

最低限自分が気になる講演に関しては予習してから臨もうかなと
あ!ここ進研ゼミでやったところだ!くらいの感覚にはしたい

来年は今年の現地組くらいの技術力をつけ参加したいです💪

参考記事

Rubykaigi2023
mruby/c
mruby/cとは?mrubyとの違いや開発環境の構築の仕方も解説
Rubyで型チェック!動かして理解するRBS入門 〜サンプルコードでわかる!Ruby 3.0の主な新機能と変更点 Part 1〜
Rubyの型を宣言するRBSについて調べてみた。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4