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
間でやりとりできるようにするための仕組み- 基本的に
Ractor
でオブジェクトを扱う場合は不変である必要がある - 参照: 【Ruby 3.0 Advent Calendar 2020】Ractor の共有可能オブジェクトについて【24日目】 - Secret Garden(Instrumental)
- 基本的に
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