2020/08/27 今週の気になった bugs.ruby

内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。

[Bug #17030] Enumerable#grep{_v} should be optimized for Regexp

  • ary.select { |e| e.match?(reg) } と比較して ary.grep(reg) の方が遅いので最適化しよう、という提案
  • これは Regexp#===MatchData を生成しているのが原因になってる
  • ただし、 match? で判定した場合は次のように grep 後に $~MatchData を取得する事ができない
ary = ["homu", "mami", "mado"]

reg = /.*/
ary.select { |e| e.match?(reg) }

# or Regexp.last_match
p $~   # => nil

ary.grep(reg)
p $~   # => #<MatchData "mado">

[Bug #17130] Method#super_method is broken for aliased methods

  • Method#super_method 経由で親メソッドを呼び出した場合に意図する呼ばれ方がしないというバグ報告
  • 以下のようにメソッドが alias 場合に Method#super_method が意図しないメソッドを呼び出す
class A
  def m1; [:A_m1] end
  def m2; [:A_m2] end
end
class B < A
  def m1; [:B_m1] + super end
  alias m2 m1
end

# この2つは OK
# B#m1 を経由して A#m1 が呼ばれる
p B.new.m2
# => [:B_m1, :A_m1]
puts

m = B.new.method(:m2)
p m.call
# => [:B_m1, :A_m1]
puts

# NG
# A#m1 ではなくて A#m2 が呼ばれる
p m.super_method.call
# => [:A_m2]