【Ruby 3.0 Advent Calendar 2020】ArrayやStringのメソッドの返り値が変更された話【15日目】

はじめに

Ruby 3.0 Advent Calendar 2020 15日目の記事になります。

昨日は、「Ruby3.0で導入される型定義!TypeprofでBlockやProcを解析してみる」です。

qiita.com

今日は、ArrayStringの返り値が変更された話を紹介します。

これまでの返り値

これまでのRubyではArrayStringを継承したクラスで新しくオブジェクトを作成し、メソッドを実行した際の戻り値が一定のものではありませんでした。

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の戻り値のクラスが一定ではないことに関してチケットも作成されていました。

bugs.ruby-lang.org

Ruby 3.0ではどうなるのか?

Ruby 3.0ではArrayStringを継承したクラスを使って作成されたに対して継承元(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が返ってくれた方が良かったりすんじゃないかと思ったりもしますが、どちらかにそろっているのは分かり易くてよさそうです

参考

github.com

bugs.ruby-lang.org