Лучшая практика Ruby: если не пустая, то каждый из них делает еще один оператор - программирование
Подтвердить что ты не робот

Лучшая практика Ruby: если не пустая, то каждый из них делает еще один оператор

1. Я не могу найти элегантный способ написать этот код:

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

Я хотел бы иметь один цикл, не записывая array дважды. Я прочитал этот, но решения недостаточно.


2. Я нахожусь в шаблоне HAML. Тот же вопрос.

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

Ответ 1

Как насчет?

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

Ответ 2

Самый чистый способ, который я видел в HAML (не простой Ruby), - это что-то вроде:

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

Как уже упоминалось в других ответах, нет необходимости в предложении else, поскольку это уже подразумевается в другой логике.

Даже если вы можете сделать все в одной чистой строке, вы не сможете достичь разметки, которую вы пытаетесь достичь (<p> if array.empty?, <ul> if array.present?). Кроме того, HAML, который вы показываете в своем вопросе, - лучший способ рассказать историю вашего кода, а это значит, что он будет более читабельным и поддерживаемым для других разработчиков, поэтому я не знаю, почему вы хотите реорганизовать что-то более загадочное.

Ответ 3

Я думаю, что нет более элегантного или читаемого способа написать это. Любой способ как-то объединить итерацию с условием приведет только к коду blackboxed, что означает: условие скорее всего будет скрыто в расширении Array.

Ответ 4

Если array пусто, тогда он не будет итерирован, поэтому блок each не должен быть кондиционирован. Поскольку возвращаемое значение each является приемником, вы можете поместить блок each в состояние empty?.

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

Ответ 5

Предполагая, что "пустой пул процессов" оставляет его пустым после обработки, вы можете оставить его иначе:

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

или в одной строке:

array.empty? ? process_empty_array : array.each { |el| process_el } 

Ответ 6

Я видел, как некоторые люди спрашивали, как справиться с этим в случае с nil.

Трюк состоит в том, чтобы преобразовать его в строку. Все nils, преобразованные в строку, становятся пустой строкой, все пустые случаи остаются пустыми.

nil.to_s.empty?
"".to_s.empty?

оба возвращают true