2022/07/07 今回の気になった bugs.ruby のチケット

今週は Ractor.make_shareable(obj) 時に obj.make_shareable を呼び出せるようにする提案がありました。

[Bug #18896] Shellwords.escape(nil) returns "empty" string

require 'shellwords'

pattern = 'Jan 15'
puts "grep #{Shellwords.escape(pattern)} file"
# => grep Jan\ 15 file
  • このモジュールに対して Shellwords.escape(nil) を渡すと空の文字列が返ってくるがこれが意図していないのではないかというバグ報告
    • 例外を出すのが意図しているとのこと
require "shellwords"

puts Shellwords.escape(nil)
# => "''"
  • このライブラリしらなかった

[Feature #18894] Object#make_shareable

  • Marshal.dump(obj)obj.marshal_dump を呼び出すように Ractor.make_shareable(obj) を呼び出した時に obj.make_shareable が呼び出されるようにする提案
  • obj ごとに固有の make_shareable を実装する必要がある時は便利そう?
    • 例えば『 Resolv::Hosts の場合は遅延して初期化を行っているので Ractor では利用できない』とコメントされていますね
      • なので make_shareable ないで事前にロードする仕組みが必要
  • ちなみに Ractor.make_shareable は任意のオブジェクトを Ractor 間でやりとりできるようにするための仕組み
obj = [1, 2, "hoge"]

# 共有可能オブジェクトではない
p Ractor.shareable? obj   # => false

# Ractor.make_shareable(obj) を呼び出すと obj を Ractor で利用できるようにする
# これは結果的に全てのオブジェクトが freeze されることになる
Ractor.make_shareable(obj)
p Ractor.shareable? obj   # => true
p obj.frozen?             # => true
p obj[2].frozen?          # => true