読書会常連の @tmtms さんが今回は不在でrubyを教えてくれる人がいなくて困ったな〜と思っていたら、rubyを知っている方が3人も来てくれてとっても助かりました。
外部からの参加者が5名、ギーラボ関係者が5名と最近になく賑やかな読書会になりました。全員がちょうど一度づつ読めたのも良かったです。 今回はrubyの文法についての質問が多めでしたが、rubyを知っている人にとってはrubyの文法理解に時間が多く取られるのはあまり良くないな〜と思いました。徐々に慣れるとは思うので、次回以降もrubyist諸氏におかれては今日に懲りずにご参加いただきたいです。
書籍内に出てくるコードはこちらで参照できます。 github.com
以下、普段pythonを書いている人間からの所感をいくつか。
getter/setterについて
attr_readerを使ってフィールドを隠蔽する、という話がありました。
pythonだとプロパティとフィールドのアクセス方法が同じなので、後からプロパティにもできます。
class Gear attr_reader :chainring, :cog def initialize(chainring, cog) @chainring = chainring @cog = cog end def ratio chainring / cog.to_f end end
は、プロパティを介さない場合は
class Gear(object): def __init__(self, chainring, cog): self.chainring = chainring self.cog = cog def ratio(self): return self.chainring / self.cog
となります。これをプロパティを介すように直すと
class Gear(object): _chainring = None _cog = None @property def chainring(self): return self._chainring @chainring.setter def chainring(self, value): self._chainring = value @property def cog(self): return self._cog @cog.setter def cog(self, value): self._cog = value def __init__(self, chainring, cog): self.chainring = chainring self.cog = cog def ratio(self): return self.chainring / self.cog
となる。う~ん、ちょっと記述量は多くなりますが、、、言いたいのはchainringおよびcogフィールドを使っている__init__
とratio
メソッドに変更が無いこと。なので後からプロパティ化することも割と手軽にできます。
配列操作について
def diameters wheels.collect {|wheel| diameter(wheel)} end
は、pythonだと普通は内包表記で書きます。
def diameters(self): return [diameter(wheel) for wheel in self.wheels]
ruby は最後に評価された値が戻り値になるそうです。これはこれで便利かも。
次回も楽しみです。