22

1.このコードを書くエレガントな方法が見つかりません:

if array.empty?
  # process empty array
else
  array.each do |el|
    # process el
  end
end

2回書くことなく、1回ループしたいと思いますarray。私はこれを読みましたが、十分な解決策はありません。


2. 私は実際に HAML テンプレートを使用しています。同じ質問。

- if array.empty?
  %p No result
- else
  %ul
  - array.each do |el|
    %li el
4

7 に答える 7

35

どうですか?

array.each do |x|
  #...
  puts "x",x
end.empty? and begin
  puts "empty!"
end
于 2013-09-12T18:58:56.800 に答える
6

私がこれを HAML (単純な Ruby ではない) で行うのを見た最もクリーンな方法は次のようなものです:

- array.each do |item|
    %li
        = item.name
- if array.empty?
    %li.empty
        Nothing here.

else他の回答で述べたように、それは他のロジックですでに暗示されているため、句は必要ありません。

each-else を 1 つのクリーンな行で実行できたとしても、達成しようとしているマークアップを達成することはできません ( <p>if array.empty?、<ul>if array.present?)。さらに、質問で示した HAML は、コードの背後にあるストーリーを伝える最良の方法です。つまり、他の開発者にとってより読みやすく、保守しやすくなるため、なぜもっと不可解なものにリファクタリングする必要があるのか​​ わかりません。 .

于 2014-01-05T04:48:41.020 に答える
2

が空の場合arrayは反復されないため、eachブロックを条件付けする必要はありません。の戻り値が受け手なので、ブロックを条件eachに入れることができます。eachempty?

if (array.each do |el|
  # process el
end).empty?
  # process empty array
end
于 2013-05-31T16:33:30.717 に答える
2

これほどエレガントで読みやすい方法はないと思います。繰り返しと条件を何らかの方法で組み合わせると、ブラックボックス化されたコードになります。つまり、条件がArray拡張機能に隠されている可能性が高くなります。

于 2013-05-31T15:18:16.190 に答える
1

「空の配列の処理」が処理後に空のままであると仮定すると、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 } 
于 2013-05-31T15:20:59.967 に答える