52

これをRubyで各ブロックを1行で書く方法はありますか?

cats.each do |cat|
   cat.name
end

プロジェクトのコード量を削減しようとしています。Ruby 1.9.2 を使用しています。

ありがとう!

4

4 に答える 4

77

はい、次のように書くことができます。

cats.each { |cat| cat.name }

または単に

cats.each(&:name)

Enumerable#eachは、繰り返し処理しているのと同じオブジェクトを返すことに注意してください(ここではcats)。そのため、ブロック内で何らかの副作用を実行している場合にのみ使用する必要があります。ほとんどの場合、猫の名前を取得する必要がありました。その場合は、代わりにEnumerable#mapを使用します。

cat_names = cats.map(&:name)
于 2012-06-12T07:16:38.813 に答える
54

改行を削除するだけです:

cats.each do |cat| cat.name end

ブロックに関しては、2 つの異なるコーディング スタイルがあることに注意してください。1 つのコーディング スタイルでは、複数行にまたがるブロックには常にdo/を使用し、単一行のブロックには常に/を使用します。あなたがその学校に従うなら、あなたは書くべきですend{}

cats.each {|cat| cat.name }

もう 1 つのスタイルは、主に副作用のために実行されるブロックには常にdo/を使用し、主に戻り値のために実行されるブロックには/を使用することです。はブロックの戻り値を捨てるので、その副作用のためにブロックを渡すだけでは意味がないので、その流派に従うなら/で書くべきです。end{}eachdoend

しかし、@toklandが言及しているように、より慣用的な方法は次のように書くことです

cats.each(&:name)
于 2012-06-12T09:24:30.627 に答える
16

Railsコンソール/irbに使用するもう1つのトリックは、コマンドを「;」で区切ることです。例えば

[1,2].each do |e| ; puts e; end
于 2012-06-12T12:34:48.323 に答える