web-dev-qa-db-ja.com

Rubyベストプラクティス:空でない場合は、それぞれ1つの演算子で他の操作を行います

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
17

どうですか?

array.each do |x|
  #...
  puts "x",x
end.empty? and begin
  puts "empty!"
end
26
vitas

これが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は、コードの背後にストーリーを伝えるするための最良の方法です。つまり、他の開発者にとって読みやすく、保守しやすいので、なぜそうするのかわかりません。もっと謎めいたものにリファクタリングしたい。

5
colllin

これを書くためのこれほどエレガントで読みやすい方法はないと思います。何らかの方法で反復を条件と組み合わせる方法は、ブラックボックス化されたコードになります。つまり、条件はArray拡張子で非表示になる可能性があります。

2
Beat Richartz

arrayが空の場合、反復されないため、eachブロックを条件付けする必要はありません。 eachの戻り値はレシーバーであるため、eachブロックをempty?条件内に置くことができます。

if (array.each do |el|
  # process el
end).empty?
  # process empty array
end
2
sawa

「空の配列を処理する」が処理後に空のままであると仮定すると、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 } 
1
Matt Gibson

配列がnilの場合、空の配列に強制できます

if (array || []).each do |x|
  #...
  puts "x",x
end.empty?
  puts "empty!"
end
0
mmsilviu