3月20日に開催された、Ruby勉強会@札幌-24に参加しました。
約9ヶ月ぶりのRuby札幌の勉強会!!
最近自分のマシンをゆっくり触る時間がなかったのですが、午前中に環境を整え(ちょっとタイムオーバーしたけど)Ruby2.0をインストールしてから勉強会へ行きました。
初めてのRuby読み合わせ
7章:メソッドについて。
Rubyのメソッドはオブジェクトに対するメッセージ送信の側面と、関数的メソッドの面を併せ持つ。
最初の頃、クラスを定義していないのにメソッドをいきなり呼べるということになかなか慣れなかったなあ。
メソッドの呼び出し方
今回の新しい発見は、Rubyではオブジェクトのメソッドを呼び出すときに、2通りの呼び出し方があるという事。
a = Hoge.new a.method(1, "str") a::method(1, "str") # これもOK
知らなかった….!! “::”(コロン2つ)の呼び出しは、クラスメソッド(static method)の場合に使うものだとばかり…
“趣味の問題”と本には書いてあったけれど、インスタンスメソッドで”::”を使う事はないだろうなあ。豆知識として一番「へええ!」となった。
“.”と”::”で内部処理(パーサー)は同じなの?という話題が上がっていました。→ 宿題
Rubyのカッコ
Rubyではメソッドの()を省略する事が出来る。ただし、引数の区切りが分からなくなる場合はWarningが出る。
例えばこのコード。
$VERBOSE = true p -10.divmod -3.5 # warning: ambiguous first argument; put parentheses or even spaces # warning: ambiguous first argument; put parentheses or even spaces #=> [2, -3.0] p -10.divmod(-3.5) # warning: ambiguous first argument; put parentheses or even spaces #=> [2, -3.0] p(-10.divmod(-3.5)) #=>[2, -3.0]
でもこれ、どうしてWarningなんだろう。マイナスがポイントっぽいのだけど。
Rubyでは()を省略できるから、()を省略する方が主流なのかなあと気になっていたのだけど、今日勉強会に参加していた人にお話を聞いたらそうでもないみたい。
コードが見づらくなるから()はきちんとつけるという人が多かった。
RailsからRubyを学習し始めた人には()を省略する人が多い傾向があるらしい。フムフム。
デメテルの法則
メソッドチェーンの話(メソッドチェーン厨はキケン!!)で出てきた法則。初めて聞いた。
Wikipediaは長くて噛み砕くのに時間がかかる。
asakichyさんのブログが簡潔にまとまっていて分かりやすかった。
「Don’t Talk to Strangers.」
メソッドチェーンを使うかどうかの一つの基準として、同じ型のオブジェクトが返ってくる間はチェーンしていても良いけれど、型が変わる場合は一旦別の変数で受けるというのを教わりました。
確かに、状態が変わっている場合は、途中を切り取って中身を確認したい事が多いので、そこを無理に一つのメソッドにするのは美しくないのだなあ。
あとは、読みやすさ(流れるような文章)のためのHackとしてメソッドチェーンが使われる場合も多いそうです(RSpecとか)。
あと、初めて知ったメソッド(個人的メモ)
String.ancestors => [String, Comparable, Object, Wirble::Shortcuts, PP::ObjectMixin, Kernel, BasicObject]
今日は1ページと少し進みました。
次回は7.1のレシーバ省略とローカル変数(127P)からになります。
リアルタイムランキングのベンチマーク
@ayako119さんのお話。
大量のトランザクションデータの更新が発生している状況での、デッドロックの回避は苦労するだろうなあ。
DBのチューニング(Index、どうロックするか)も、とても大変そう。
実際にどのような実装にしたかは qiitaの記事[リアルタイム・ランキングの実装例をRailsで書いてみた]があります。
本日のスライドはこちら。
ActiveRecord::CounterCache#increment_counter
ActiveRecord::CounterCache#decrement_counter
というメソッドの存在を知る事が出来たのも良かった。
関数型言語の話
@tmaedaさんによる、関数型言語(静的型付き関数型言語)の話。
関数型言語は、学習曲線の違い(テンションの上がるポイントの違い)から「初学者には向かないけれど慣れてくるとコンパイラが愛おしくなってくる」らしいのです。
静的型付き関数型言語の場合、nilチェックなども型エラーとしてコンパイル前に解決できるので、コンパイルさえ通ってしまえば実行時エラーに悩まされる事がほとんどない、というのは魅力的に聞こえました。
どこで起きているか分からない実行時例外を追う作業は、切羽詰まった状態であればあるほど辛いものです。
Rubyとの比較のところで「Rubyのアレも関数型で実現できるけど、そもそもオブジェクトというものが存在しないので、関数型だと必要ないものもある」というお話をしていました。
この頭の切り替えが一番難しそうだ。
関数型言語は3年くらい前にちょっとだけやってみて、よくわからないまま放置しているので、もう1回ちゃんとやってみようかなあ。
Try OCamlは面白そうなのでやってみてる。
# 発表資料に書いてあった炎上案件について読みにいっていたらスタバで1時間以上時間が経ってしまったのは秘密です。
ということで、今回も非常に濃密な勉強会でした。
次回は@iakioさんが「SQLアンチパターン」について語ってくださるとのことなので、とても楽しみです!!!