こんにちは。まいむです。
私は、毎週火曜と金曜の朝にオンラインで開催されるりんどく.rbという輪読会に参加しています。
基本的には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にはありました。
伊藤さんが模範回答で教えてくださった rotate
メソッドです。
これを用いれば私が書いたpitch_shift_index
を求める処理を書かずに、要件が実現できます!
(Rubyすごい!!)
コードが動いた!で満足せず、すでに同じことができるメソッドがないかを調べるようにしていきたいなと誓いましたw
興味を持たれた方は是非 rotate
メソッドを用いて実装してみてください!
そしてもし良ければ、是非輪読会で一緒に勉強しましょう〜!