Ответ 1
Как насчет?
array.each do |x|
#...
puts "x",x
end.empty? and begin
puts "empty!"
end
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
Как насчет?
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
, поскольку это уже подразумевается в другой логике.
Даже если вы можете сделать все в одной чистой строке, вы не сможете достичь разметки, которую вы пытаетесь достичь (<p>
if array.empty?, <ul>
if array.present?). Кроме того, HAML, который вы показываете в своем вопросе, - лучший способ рассказать историю вашего кода, а это значит, что он будет более читабельным и поддерживаемым для других разработчиков, поэтому я не знаю, почему вы хотите реорганизовать что-то более загадочное.
Я думаю, что нет более элегантного или читаемого способа написать это. Любой способ как-то объединить итерацию с условием приведет только к коду blackboxed, что означает: условие скорее всего будет скрыто в расширении Array
.
Если array
пусто, тогда он не будет итерирован, поэтому блок each
не должен быть кондиционирован. Поскольку возвращаемое значение each
является приемником, вы можете поместить блок each
в состояние empty?
.
if (array.each do |el|
# process el
end).empty?
# process empty array
end
Предполагая, что "пустой пул процессов" оставляет его пустым после обработки, вы можете оставить его иначе:
if array.empty?
# process empty array
end
array.each do |el|
# process el
end
или в одной строке:
array.empty? ? process_empty_array : array.each { |el| process_el }
Я видел, как некоторые люди спрашивали, как справиться с этим в случае с nil.
Трюк состоит в том, чтобы преобразовать его в строку. Все nils, преобразованные в строку, становятся пустой строкой, все пустые случаи остаются пустыми.
nil.to_s.empty?
"".to_s.empty?
оба возвращают true