これをRubyで各ブロックを1行で書く方法はありますか?
cats.each do |cat|
cat.name
end
プロジェクトのコード量を削減しようとしています。Ruby 1.9.2 を使用しています。
ありがとう!
これをRubyで各ブロックを1行で書く方法はありますか?
cats.each do |cat|
cat.name
end
プロジェクトのコード量を削減しようとしています。Ruby 1.9.2 を使用しています。
ありがとう!
はい、次のように書くことができます。
cats.each { |cat| cat.name }
または単に:
cats.each(&:name)
Enumerable#each
は、繰り返し処理しているのと同じオブジェクトを返すことに注意してください(ここではcats
)。そのため、ブロック内で何らかの副作用を実行している場合にのみ使用する必要があります。ほとんどの場合、猫の名前を取得する必要がありました。その場合は、代わりにEnumerable#mapを使用します。
cat_names = cats.map(&:name)
改行を削除するだけです:
cats.each do |cat| cat.name end
ブロックに関しては、2 つの異なるコーディング スタイルがあることに注意してください。1 つのコーディング スタイルでは、複数行にまたがるブロックには常にdo
/を使用し、単一行のブロックには常に/を使用します。あなたがその学校に従うなら、あなたは書くべきですend
{
}
cats.each {|cat| cat.name }
もう 1 つのスタイルは、主に副作用のために実行されるブロックには常にdo
/を使用し、主に戻り値のために実行されるブロックには/を使用することです。はブロックの戻り値を捨てるので、その副作用のためにブロックを渡すだけでは意味がないので、その流派に従うなら/で書くべきです。end
{
}
each
do
end
しかし、@toklandが言及しているように、より慣用的な方法は次のように書くことです
cats.each(&:name)
Railsコンソール/irbに使用するもう1つのトリックは、コマンドを「;」で区切ることです。例えば
[1,2].each do |e| ; puts e; end