こんにちは虎の穴ラボの吉岡です。
本稿は虎の穴ラボ 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