2021/10/09 今回の気になった bugs.ruby のチケット
今週は Immutable
モジュールを追加して不変なオブジェクトを明示化しよう、というチケットがありました。
[Feature #18035] Introduce general model/semantic for immutable by default.
- 以下のように
Immutable
モジュールを定義して mixin すると明示的にfreeze
されるようにする、という提案
module Immutable def new(...) super.freeze end end class MyImmutableObject extend Immutable def initialize(x) @x = x end def freeze return self if frozen? @x.freeze super end end o = MyImmutableObject.new([1, 2, 3]) puts o.frozen? # => true
- これは
dup
やclone
した場合もfreeze
になる - どう
freeze
するのかはfreeze
メソッドを再定義してクラスごとに定義するようにするみたいです - めっちゃ議論が進んでてまとめきれてないんですが
#freeze
と#deep_freeze
の違いや#deep_freeze
するとsingleton_class
まで不変になってしまい困るのでは?みたいな話や不変
にしたときの利点はなにか、みたいな話を議論してるぽいですねえ
[Bug #1823] Conversion to float not working for object with to_f method
Thread#join
で引数をFloat
に変換しているが#to_f
が呼ばれていないというバグ報告- Ruby 3.0 以降から再現するようになった
class Something def to_f 0.1 end end # error: `join': can't convert Something into Float (TypeError) Thread.new{ }.join(Something.new)
- このバグは既に修正済み
[Bug #18180] opt_newarray_min/max instructions ignore refined methods
- 以下のようなケースで Refinements が正しく反映されていないというバグ報告
module M refine Array do def min; :min; end def max; :max; end end end using M # これは Refinements が適用される pp [1, 2, 3].min # => :min # これは Refinements が適用されない pp [1+0, 2, 3].min # => 1
- これはレシーバがリテラルの場合に最適化していて Refinements が反映されなくなっているらしい
[Feature #6118Feature #6118] Hash#keys_of(values), returns related keys of given values
- Hash から指定した要素のキーを複数個取ってくる
Hash#keys_of
メソッドの提案
data = { a: 1, b: 2, c: 3, d: 1 } # これは1つだけを返す p data.key(1) # => :a # keys_of の場合は見つかったキーをすべて返す p data.keys_of(1) # => [:a, :d]
- チケット自体は9年前のやつで最近 PR が投げられたのでキャッチアップした
- 必要なユースケースとかが提示できれば入るやも? っg