Ruby: 自分のクラスに`#to_a`を実装すべきじゃない(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: You should not implement #to_a for your classes 原文公開日: 2018/02/02 著者: zverok — 名サイト「rubyreferences.github.io」の作者でもあります。 Ruby: 自分のクラスに#to_aを実装すべきじゃない(翻訳) えっと、このブログをときどき読んでる人なら言葉のキツさをご存知と思います。また書いてしまった。 挨拶代わりに、Rubyの便利なイディオムのひとつであるKernel#Arrayメソッドについて軽くおさらいしておきましょう。またの名を「知らんけど、んなもんArrayに決まってんだろ!」というやつです。 あるデータを用いて作業しているときに、1個の値か値の配列のどちらをも受け取るまたは返す可能性のあるメソッドが使えるとしましょう。その次に、両者の区別をなくして確実に1つの配列として扱う必要が生じたとしたら、次のように書けるでしょう。 Array(1) # => [1] Array(‘test’) # => [“test”] Array([1, 2, 3]) # => [1, 2, 3] — 1個の配列は何も変わらない Array(nil) # => [] — ま、わかるっちゃわかる このステキなコード片の挙動は簡単に見落とされがちですが、ありがたいものですし、ほとんどの場合直感を裏切りません。Array(nil)はここでは割りといい感じですし、[nil]を返すのと比べて少々論理的ではないとはいえ、現場で欲しいものとしては十分過ぎるぐらいでしょう。 しかし、直感はときに裏切られます。 val = Time.now Array(val) # => [3, … Continue reading Ruby: 自分のクラスに`#to_a`を実装すべきじゃない(翻訳)