はじめに
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の新機能であるsubtract
とparse
について必要な理由と、使用方法について
細かく解説されていました。
そもそもRBSって?
RBSとはRuby3.0で導入されたコードに型を提供する仕組みのことです!
これによってGo
やJava
のように静的な型付けが出来るようになりました。
これによりコンパイル時にコードの型エラーを検出することができるため、コードの信頼性と保守性を向上させるのにも役立ちます。
実際に書いてみよう
今回はRBSとセットで使用されることの多い、SteepとTypeProfを使って書いていきます!
下記の手順で作業を行なっていきます!
1.クラスが定義されているコードを用意
2.1のコードをTypePropfでテンプレートを作成する
3.Steepを使用して型エラーを検出する
というわけで上記を検証するために以下のコマンドを叩いておいてください!
$ gem install typeprof steep
1.クラスが定義されているコードを用意
今回は下記の長方形のクラスファイルを用意します
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
上記のコマンド実行により下記のファイルが作成されます。
# Classes
class Rectangle
attr_reader width: untyped
attr_reader height: untyped
def initialize: (width: untyped, height: untyped) -> void
def area: -> untyped
end
今回は元ファイルに型定義されいないので、untyped
、void
から型を変えてあげます
# 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
が生成されます。
生成されたファイルを下記のようにに書き換えます!
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つ目のエラーはInteger
をString
に割り当てられない、*
と互換性のあるInteger
が見つからないよ〜といったものです
width:Integer
として正しい型に修正してみてください。
もう1度 steep check
してください
すると
$ steep check
................................................................................
No type error detected. 🫖
と出力されエラーがない言葉わかります!
内容
前置きが長くなりました。
今回のプレゼンではrbs subtract
とrbs 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について調べてみた。