はじめに
Ruby 3.0 Advent Calendar 2020 15日目の記事になります。
昨日は、「Ruby3.0で導入される型定義!TypeprofでBlockやProcを解析してみる」です。
今日は、Array
やString
の返り値が変更された話を紹介します。
これまでの返り値
これまでのRubyではArray
やString
を継承したクラスで新しくオブジェクトを作成し、メソッドを実行した際の戻り値が一定のものではありませんでした。
class SubArray < Array end sub = SubArray.new([1, 2, 3]) p sub p sub.class.name # => SubArray p sub.uniq.class.name # => SubArray p sub.rotate.class.name # => Array
その為、戻り値のオブジェクトがどのクラスかを確認しなければならなくなり、非常に能率の良くない状況がありました。
実際にArray
の戻り値のクラスが一定ではないことに関してチケットも作成されていました。
Ruby 3.0ではどうなるのか?
Ruby 3.0ではArray
やString
を継承したクラスを使って作成されたに対して継承元(Array
とかString
)のクラスのメソッドを実行すると以下のように継承元のクラスのオブジェクトが返ります。
class SubArray < Array end sub = SubArray.new([1, 2, 3]) p sub p sub.class.name # => SubArray p sub.uniq.class.name # => Array p sub.rotate.class.name # => Array
継承を使って作成したSubArray
から一律でArray
が返ってくるので分かりやすくなってますね。
こういうケースだと、SubArray
が返ってくれた方が良かったりすんじゃないかと思ったりもしますが、どちらかにそろっているのは分かり易くてよさそうです