2021/10/09 今回の気になった bugs.ruby のチケット

今週は Immutable モジュールを追加して不変なオブジェクトを明示化しよう、というチケットがありました。

[Feature #18035] Introduce general model/semantic for immutable by default.

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

[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

[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]