2012-06-12 7 views
31

このブロックをRubyに書き込む方法は1行ありますか?Rubyで各ブロックを1行にすることはできますか?

cats.each do |cat| 
    cat.name 
end 

私は自分のプロジェクトでコードの量を減らそうとしています。私はRuby 1.9.2を使用しています。

ありがとうございます!

+5

このお試しくださいcats.each {| cat | cat.name} –

答えて

42

はい、あなたが書くでしょう:

cats.each { |cat| cat.name } 

またはsimplyを:

cats.each(&:name) 

Enumerable#eachはあなたが反復処理されている同じオブジェクト(cats)を返すので、それだけでそれを使用することは理にかなっていることはあなたがブロック内で何らかの副作用をしているならば。それが来るとき、二つの異なるコーディングスタイルがある

cats.each do |cat| cat.name end 

注:

cat_names = cats.map(&:name) 
+0

私はこれのような何かをしたいのですか(現在は2つのライナーです):User.where(:email => /[email protected]/).each do | user | user.destroy end – Goalie

+1

'User.where(:email => /[email protected] /)。each(&:destroy)'。ここで '破壊 'は副作用であるため意味があります。しかし、私は 'User.destroy_all(:email => /[email protected]/)'と書いています。 – tokland

46

ちょうど改行を削除します。あなたの代わりにEnumerable#map表現を使用しますので、ほとんどの場合、あなたは、猫の名前を取得したいですブロックに。一つのコーディングスタイルは常にに複数のラインとシングルラインブロックの常に使用{/}にまたがるブロックのための使用do/endを言います。あなたがその学校に従うならば、あなたは

cats.each {|cat| cat.name } 

を書く必要があり、他のスタイルは常に主のために実行されたブロックのために、主にその副作用のために実行されたブロックのためdo/endを使用して{/}です戻り値eachはブロックの戻り値を破棄するため、副作用のブロックを渡すのが理にかなっているため、その学校に従う場合は、do/endと書いてください。

しかし@toklandは言及して、より多くの慣用的な方法は、私は、レールコンソール/ IRBに使用するもう一つのトリックはでコマンドを分離することである

cats.each(&:name) 
9

を書くことであろう「;」例えばあまりにもそれを行う必要があります

[1,2].each do |e| ; puts e; end 
-2
for cat in cats;cat.name;end 

+0

これは非常に醜いです、受け入れられた答えを見てください。あなたは ";"可能な限りコードを読みやすくするために使用します。または、少なくともラインジャンプにスペースを追加する。また、 "ブロック1ライナー"のために質問してください。 –

関連する問題