【一人 bugs.ruby Advent Calendar 2020】[Bug #17423] `Prepend` should prepend a module before the class【24日目】
一人 bugs.ruby Advent Calendar 2020 24日目の記事になります。
[Bug #17423] Prepend
should prepend a module before the class
このブログでも何回か紹介しているんですが Ruby 3.0 では Module#include / #prepend
の挙動がちょっと変わります。
特に以下のように Ruby 2.7 と Ruby 3.0 でかなり挙動が変わるコードも存在しています。
module M; end module A; end class B; include A; end A.prepend M B.prepend M # B.prepend M してるのに M が B よりもあとに来る p B.ancestors # 2.7 => [M, B, A, Object, Kernel, BasicObject] # 3.0 => [B, M, A, Object, Kernel, BasicObject]
このチケットはこの問題を解決するために以下のように M
が重複することを許容しよう、という旨のチケットになります。
module M; end module A; end class B; include A; end A.prepend M B.prepend M # このように修正する p B.ancestors # => [M, B, M, A, Object, Kernel, BasicObject]
これはこれでちょっと気持ち悪い気もするんですがまあ無いよりはマシですかねえ…ぶっ壊れるときはどっちにしてもぶっ壊れそうだし…。
この問題は Ruby 3.0 リリース後に対応される予定となっています。
ちなみにこのチケットはまつもとさん自身が建てていたりします。