虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Ruby3.3の新機能を先行レビューしてみた #虎の穴ラボ Advent Calendar 2023

こんにちは虎の穴ラボの吉岡です。

本稿は虎の穴ラボ AdventCalender 2023の24日目の記事です。 (予約投稿)
昨日は植竹さんの「「サイバーリスクマネジメントの強化書」を読んだ感想」でした。

さて、今日は12/24、つまり明日25日は...そうRuby3.3のリリース予定日です!
NEWS.mdを参考に今回のメジャーアップデートの中からCore Classの新しい機能をいくつか試してみようと思います。
使うバージョンは正式リリース前のruby 3.3.0rc1を使用します。正式リリース版では変更がある可能性があります。

Dirクラス

Dirクラスには chdir fchdir for_fd の新しいメソッドが追加されています。

Dir#chdir

現在の作業ディレクトリを変更する事ができるようになるメソッドです。
ブロックで使用した場合はブロック中のみディレクトリが変更されます。  

puts Dir.pwd # /Users/hoge/advent_calendar/ruby3_3_0
Dir.chdir('..')
puts Dir.pwd # /Users/hoge/advent_calendar

# Block

puts Dir.pwd # /Users/hoge/advent_calendar/ruby3_3_0

Dir.chdir do
  puts Dir.pwd # /Users/hoge/advent_calendar
end

puts Dir.pwd # /Users/hoge/advent_calendar/ruby3_3_0

Dir#fchdir

chdir と同じく作業ディレクトリを変更するメソッドです。
chdirとの大きな違いはファイル記述子を引数として受け取りディレクトリを変更する点にあります。  

puts Dir.pwd # /Users/hoge/advent_calendar/ruby3_3_0
d = Dir.new('..')

Dir.fchdir(d.fileno)
puts Dir.pwd # /Users/hoge/advent_calendar

Dir#for_fd

ファイル記述子から新しいDirオブジェクトを生成するメソッドです。
既にあるディレクトリを別のDirオブジェクトに紐づける際に使用できます。  

d1 = Dir.new('..')
d2 = Dir.for_fd(d1.fileno)

puts d1.path # ..
puts d2.path # nil

d1.chdir do 
  puts Dir.pwd # /Users/hoge/advent_calendar
end

d2.chdir do
  puts Dir.pwd # /Users/hoge/advent_calendar
end

MatchData

MatchDataクラスには新しく named_captures にオプションが追加されています。  

MatchData#named_captures

named_capturesメソッドはMatchDataのオブジェクトからHashを作成するメソッドです。
Ruby3.3では作成されるHashのKeyがシンボルにするかのオプション symbolize_names が追加されています。  

m = /(?<a>.)(?<b>.)/.match("01")
puts m.named_captures # {"a"=>"0", "b"=>"1"}
puts m.named_captures(symbolize_names: true) # {:a=>"0", :b=>"1"}

Range

Rangeクラスには overlap? メソッドが追加されています。  

Range#overlap?

overlap? メソッドはRangeクラスのオブジェクト同士で値がかぶっている部分があるかを判定します。
今まではActiveSupportで実装されていましたが標準ライブラリで実装されました。  

(0..10).overlap?(5..15) # true
(0..10).overlap?(11..15) # false

String

Stringクラスにはbytespliceメソッドの引数が追加されています。  

String#bytesplice

bytespliceメソッドは文字列の指定の範囲を指定の文字列で置き換えるメソッドです。
このbytespliceメソッドに新しく置き換える文字列の開始位置、長さを指定する引数が追加されました。
開始位置、長さを指定しない場合は今で通りの置換が行われます。

# 今まで/指定無し
a = "abcdefg"
b = "012345"

# 変数aの文字列0番目から3文字("abc")を変数bの内容("012345")に置き換える
a.bytesplice(0, 3, b)
puts a # "012345defg"

# Ruby3.3
c = "abcdefg"
d = "012345"

# 変数cの文字列0番目から3文字("abc")を変数dの1番目から3文字("123")に置き換える
c.bytesplice(0, 3, d, 1, 3)
puts c # "123defg"

また範囲指定でも同じようにできます。

# 今まで/指定無し
a = "abcdefg"
b = "012345"

a.bytesplice(0...3, b)
puts a # "012345defg"

# Ruby3.3
c = "abcdefg"
d = "012345"

c.bytesplice(0...3, d, 1..3)
puts c # "123defg"

まとめ  

痒いところに手が届きそうな機能が追加されてるのが個人的に嬉しいところです!
今回紹介した機能の他にもパーサーの追加やYJITの高速化、バグの修正など沢山の更新が入っています。
ぜひ新しいRubyを試してみてください。

明日は最終日、白石さんの「「非エンジニア人事のためのエンジニア採用の教科書」を読んで実践したいこと3選」です!

採用情報

虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp