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">
- この差異をどうするか議論している
- そもそも
grep
した後に$~
を参照することは稀なので参照できないようにしてもいいのでは?などなど
- そもそも
/hoge/f
みたいに正規表現リテラルにf
オプションを追加し、それで制御できるようにすればいいのでは?という提案もされているf
がない場合はRegexp#===
で判定し、f
がある場合はRegexp#match?
で判定するイメージary.grep(/.*/f)
みたいに書くことで高速化できる- オプションで制御すると
#all?
#any?
といったメソッドも高速化することができる - コメント:https://bugs.ruby-lang.org/issues/17030#note-7
- ベンチマーク:https://bugs.ruby-lang.org/issues/17030#note-9
- PR:https://github.com/ruby/ruby/pull/3455
- 他には
f
オプションではなくて# boolean_regex_literal: true
みたいなマジックコメントで制御すればいいのでは?などなど…
[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]
- 上記の場合、
method(:m2).super_method
はA#m1
を返してほしいがA#m2
が返ってくる - 関連チケット:https://bugs.ruby-lang.org/issues/11189