内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
[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