おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

do...endと{...}の違い

Rubyのブロックの記述方法にはdo...endと{...}の2種類があります。僕は基本的にRubyコーディング規約を参考にしてRubyコードを書いているのでdo...end派なのですが、Railsのnamed_scopeをこんな風に書いたらエラーがでました

named_scope :hoge, lambda do |name|
  { :conditions => ["name = ?", name] }
end
#=> ArgumentError "tried to create Proc object without a block"

でもこうしたらOK。

named_scope :hoge, lambda { |name|
  { :conditions => ["name = ?", name] }
}

do...endと{...}って同じかと思っていましたが違うようです。リファレンスを読むと、結合強度が違うのだそう。

結合強度の違い

do...endだと、ブロックはfoobarメソッドへの引数になります。

foobar a, b do
  #...
end

{...}だと、ブロックはbメソッドの引数となります。

foobar a, b {
  #...
}

named_scopeをどうかくか

ということは、named_scopeをdo..endで書くには

named_scope(:hoge, lambda do |name|
  { :conditions => ["name = ?", name] }
end)

のように括弧をつけて、ブロックがlambdaの引数であることを明らかにしてあげればいいのですね。でも見た目が汚いですね。named_scopeのときにはおとなしく{...}を使うようにしようと思います。