Rubyを始めて驚いた!!!コード

in

数ヶ月前、Railsを知り初めてRubyでコードを書いたとき一番悩んだのがチュートリアルにあった次のコード

@category_pages, @categories = paginate :category, :per_page => 10

一見、何をしているのかよく分からない、というか式の区切りがよくわかりませんでした。長らく、C/C++でコードを書いてきましたがこんなコードお目にかかったことがない。まず、右辺(らしき)paginateメソッドを頼りに調べてみて、()が省略されていることにようやく気づき、

@category_pages, @categories = paginate(:category,:per_page => 10)

で、次に悩んだのが@category_pagesの扱い。どうにも、paginate()が複数の戻り値を返しているようにも見えるがマサカね。というわけで調べていくと「多重代入」というマジックでした。

多重代入は複数の式または配列から同時に代入を行います。左辺の各式はそれぞれ代入可能でなければなりません。右辺の式が一つしか与えられなかった場合、式を評価した値は配列に変換されて、各要素が左辺のそれぞれの式に代入されます。左辺の要素の数よりも配列の要素の数の方が多い場合には、余った要素は無視されます。配列の要素が足りない場合には対応する要素の無い左辺には nil が代入されます。

これはエレガントだなと感動しました。式だけを見れば完全に二つの戻り値を返しているように見えます。プログラマなら一度は二つの値を返したいなと思う場面に出会ったことがあると思いますが、見事に願いをかなえてくれています。もちろんいろんなプログラミング言語で配列やポインタを駆使することで同様のことができるのだと思うのですがこのコードが一番スッキリします。(PerlやらPaythonなんかも同じなのかな?)ただ、()の省略はどうかな?と思います。慣れてくれば別段迷うこともないでしょうし省略したほうがちょっとカッコイイ(?)気がしますが、やはりあったほうがわかりやすい。

Rubyに限らずコードの書き方は千差万別で、コンパイラが許してくれる限りそれで良いのかもしれませんが、それでも人なり(グループで開発していればグループ)の統一が必要になります。そんな風に思いながらコードを見直してみるとバラバラですがなぁ~。省略したりしてなかったり。未だ理解が浅いということですね。シンボルを使うかどうかの切り分けなんて未だ分からないもの。(ルールがあるなら教えて欲しい!)

それにしても、新しくプログラミング言語を習得するのはRubyといえども容易ではありません。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/78

Comments