りんどく.rbでチェリー本題10章の課題に新しいメソッド追加をやった話

こんにちは。まいむです。

私は、毎週火曜と金曜の朝にオンラインで開催されるりんどく.rbという輪読会に参加しています。

rindokurb.connpass.com

基本的にはrubyに関する技術書を読む輪読会形式ですが、今回チェリー本筆者の伊藤さんにご助言いただき、チェリー本題10章の課題に新しいメソッドを追加する問題に各自取り組んでみることになりました。

第10章はワードシンセサイザーを作るという例題があり、Procオブジェクトを活用して実装を進めます。

本には記載のない新しいメソッドの詳細は「指定された数だけプラスにもマイナスにもアルファベットをシフトする」というものです。

各自が考えてきた実装内容をりんどく.rbの開催日に発表しあったのですが、みんなアプローチが少しずつ違っていて、なぜそのようにコードを書いたのかという詳細を聞くことがとても勉強になりました。

普段、自分がどういう理由でそのコードを書いたかを説明する機会はあまりなく、言語化するということ自体が新鮮でした。

参考までに私が書いたコードを載せてみます。

module Effects
  ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  def self.pitch_shift(pitch)
    ->(words) do
      words.split('').map { |word|
        if word.match?(/[A-Za-z]/)
          alphabet = word.match?(/[A-Z]/) ? ALPHABET : ALPHABET.downcase

          start_index = alphabet.index(word)
          shift_index = start_index + pitch

          pitch_shift_index = shift_index % 26
          alphabet[pitch_shift_index]
        else
          word
        end
      }.join
    end
  end
end
  • pitch_shift メソッドは引数にシフトさせたい数値を取る
  • ラムダでProcオブジェクトを作り、callメソッドで戻り値を返せるようにする
  • アルファベットの文字数内でプラスマイナスにcallメソッドで渡された引数の文字をシフトさせるために、pitch_shift_index を求める
  • pitch_shift_indexの値に応じて文字をシフトさせる

とざっくりこんな感じです。

これで要件自体は満たせましたが、上記のようなコードを書かずもっとシンプルなコードを書く方法がRubyにはありました。

docs.ruby-lang.org

伊藤さんが模範回答で教えてくださった rotate メソッドです。

これを用いれば私が書いたpitch_shift_indexを求める処理を書かずに、要件が実現できます! (Rubyすごい!!)

コードが動いた!で満足せず、すでに同じことができるメソッドがないかを調べるようにしていきたいなと誓いましたw

興味を持たれた方は是非 rotate メソッドを用いて実装してみてください!

そしてもし良ければ、是非輪読会で一緒に勉強しましょう〜!