Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2011-10-09

#yokohamarb のRubyレシピブック読書会が面白い

@1syo が中心となって開催している Rubyレシピブック を用いたYokohama.rbでの恒例セッション。昨日で3回目だったかな。

これが面白い。どういう意味で面白いかというと、まず単純にRubyを深く学ぶことができて面白い。 ふだん何気なく使っているRubyの機能も、ちょっと掘り下げてみれば知らないことが山ほど出てくる。 そして、ふっと湧いた謎をその場の参加者みんなで考察してゆく流れがとっても心地良い。

昨日は「008繰り返し」から。

008繰り返し

まず「whileは使わない」という話が出る。いやそんなことはない普通に使うでしょ。

例えばこんなの。

while e = ary.shift
  ...
end

aryがキューでここに要素が入ってきたら、要素を頭から取り出しつつ処理をしていくときとか。

会場で自分の書いたソースをgrepしてみたらこんなのが見つかった。

rand < 0.7 ? self.lv += 1 : break while true

これは可読性が低いって言われた。たしかにそうかも知れない。でもこのくらいだと1行にまとめたい衝動が我慢出来ない。

今あらためてgrepしてみるとこんなのが見つかった。

create while count < 5 

これはActiveRecord::Baseを継承したモデルのクラスメソッドでやってるのだけど、 こっちはwhileを使うとうまく書けるいい例じゃないかな。

untilは個人的にあまり使わないなあ。ということはやっぱりwhileを使う頻度がそもそも少ないということかもしれない。unlessは普通に使うわけだし。

もちろんforも使わない。

繰り返し処理をもう一度実行するredoは使ったことがないのだけど、これは単に自分の発想が及ばなかっただけで実際使える機能じゃないかな。

さてここで書籍に書かれていないretry(索引にも載っていない!)をネタにかつてないほど盛り上がったのだけど長いので省略。

個人的にretryは「勘違いによって罠となり得るから繰り返し処理では使えなくした」と推測してる(もしくはそんな話しを聞いたことがある気がする)のだけどどうだろう。

009メソッド呼び出し

メソッド呼び出しにおけるカッコの省略基準について質問が出た。個人的な使い分けとしてはメソッドの戻り値を利用する場合はカッコを書くという基準でやってて、でこれは青木さんのコーディングスタイルがそうだから...と説明してその場で青木さんのコーディングスタイルを読んだのだけど、そんなことどこにも書いていないっ!

それが青木さんスタイルと思ってたのだけど完全に勘違いっだのかな?青木さん本人から直接聞いたという可能性もなくはないけど...それはないかなー。

010ブロック

ブロックは難しい。持論としてブロックが理解できたらRuby中級者を名乗っていいとかねがね思っている。

C言語から来たプログラマには、以下のようなコードの仕組みと流れがまったく想像できないものである。

ary.each do |e|
  puts e
end

オレはブロックを理解するまで1〜2年ほどかかったのだけど、やっぱり他にもそういう人がいた。

そのあと1.9では変数がシャドウイングされることをみんなで確認。なるほどー。

さらに「;」を使ってブロックローカル変数が書けることを初めて知った。勉強になるー。

ary.each do |e; x|
  x = "hello"
  puts e, x
end

puts x # エラー: undefined local variable or method `x'

この節の最後にprocが出てくるんだけど、ここはまた時間がかかりそうなので次回のお楽しみとすることとした。紙面上はたった6行だけど。

レシピブック は初心者から上級者まで楽しむことの書籍として非常に良い選択だったと思う。@1syo GJ!