1.このコードを書くためのエレガントな方法が見つかりません:
if array.empty?
# process empty array
else
array.each do |el|
# process el
end
end
array
を2回記述せずに、ループを1つにしたいのですが。 this と読みましたが、十分な解決策はありません。
2.私は実際にHAMLテンプレートを使用しています。同じ質問。
- if array.empty?
%p No result
- else
%ul
- array.each do |el|
%li el
どうですか?
array.each do |x|
#...
puts "x",x
end.empty? and begin
puts "empty!"
end
これがHAML(プレーンRubyではない)で行われるのを私が見た中で最もクリーンな方法は、次のようなものです。
- array.each do |item|
%li
= item.name
- if array.empty?
%li.empty
Nothing here.
他の回答で述べられているように、else
句は他のロジックですでに暗示されているため、必要ありません。
それぞれを1つのクリーンな行で実行できたとしても、達成しようとしているマークアップを達成することはできません(<p>
if array.empty?、<ul>
if array.present?)。さらに、質問で示したHAMLは、コードの背後にストーリーを伝えるするための最良の方法です。つまり、他の開発者にとって読みやすく、保守しやすいので、なぜそうするのかわかりません。もっと謎めいたものにリファクタリングしたい。
これを書くためのこれほどエレガントで読みやすい方法はないと思います。何らかの方法で反復を条件と組み合わせる方法は、ブラックボックス化されたコードになります。つまり、条件はArray
拡張子で非表示になる可能性があります。
array
が空の場合、反復されないため、each
ブロックを条件付けする必要はありません。 each
の戻り値はレシーバーであるため、each
ブロックをempty?
条件内に置くことができます。
if (array.each do |el|
# process el
end).empty?
# process empty array
end
「空の配列を処理する」が処理後に空のままであると仮定すると、elseを省略できます。
if array.empty?
# process empty array
end
array.each do |el|
# process el
end
または1行で:
array.empty? ? process_empty_array : array.each { |el| process_el }
配列がnilの場合、空の配列に強制できます
if (array || []).each do |x|
#...
puts "x",x
end.empty?
puts "empty!"
end