Ruby on Rails勉強会に参加してきた
知り合いのid:gutch01が勤務しているクレオフーガさんでRuby on Railsの勉強会が開催されたので参加してきました。勉強会と言っても知り合いの知り合いが集まってRubyネタを話す情報交換会みたいなアットホームな雰囲気の会でした。その時私が話をした内容を復習がてらメモしておきます。
Ruby技術者認定試験
先日のブログとほぼ同等のことです。
http://d.hatena.ne.jp/tech-kazuhisa/20100304
標準クラスの拡張
irb(main):001:0> class String irb(main):002:1> def say irb(main):003:2> "hello!"+self.to_s irb(main):004:2> end irb(main):005:1> end => nil irb(main):009:0> a = "kazuhisa" => "kazuhisa" irb(main):010:0> a.say => "hello!kazuhisa" irb(main):011:0>
てな感じでStringクラスを拡張できます。同様の手法でRailsではStringにblank?メソッドが追加されています。
特定のオブジェクトにメソッドを追加する
irb(main):001:0> module Hoge irb(main):002:1> def say irb(main):003:2> "hello!"+self.to_s irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> a = "kazuhisa" => "kazuhisa" irb(main):007:0> b = "gucchi" => "gucchi" irb(main):008:0> a.extend(Hoge) => "kazuhisa" irb(main):009:0> a.say => "hello!kazuhisa" irb(main):010:0> b.say NoMethodError: undefined method `say' for "gucchi":String from (irb):10 irb(main):011:0>
クラスに対しての機能追加ではなく、作成されたオブジェクトに機能を後から追加できるのがミソ。
ruby-debug
ruby-debugを使用するとCUIベースながらVisual StudioやEclipseみたいなブレークポイントを置いてのステップ実行ができます。
まずはgemを使用してインストールしましょう。
gem install ruby-debug
railsを起動する際にデバッグオプションをつけて起動しましょう。
ruby script/server -u
ソース中の停止したい場所に「debugger」の文字を入れましょう。
def recomendedby debugger @user = User.find_by_name(params[:name]) if @user.nil? #ユーザーが見つからない場合。後で共通エラー画面に飛ばす redirect_to :controller => 'main' return end
debuggerを埋め込んだ箇所にさしかかると処理が一時的に停止します。
コマンドラインで動作を確認しながらステップ実行することができます。
n:次の行に進む l:現在行の周辺を表示する c:一気に進める
他にも色々コマンドがあるのでruby-debugでググッて調べてみましょう。
yield
yieldを使うとスコープが狭くなっていいよね。
irb(main):001:0> def say irb(main):002:1> yield "hello!" irb(main):003:1> end => nil irb(main):004:0> say do |x| irb(main):005:1* puts x irb(main):006:1> end hello! => nil
block_given?を使うとopenみたいに通常の戻り値とブロックを判別することができます。
irb(main):001:0> def say irb(main):002:1> if block_given? irb(main):003:2> yield "hello!" irb(main):004:2> else irb(main):005:2* "hello!" irb(main):006:2> end irb(main):007:1> end => nil irb(main):008:0> say => "hello!" irb(main):009:0> say do |x| irb(main):010:1* puts x irb(main):011:1> end hello! => nil