1.我找不到一种优雅的方式来编写这段代码:
if array.empty?
# process empty array
else
array.each do |el|
# process el
end
end
我想有一个循环,没有写两次array
。我读了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
子句,因为这已经隐含在其他逻辑中了。
即使你可以在一个简洁的行中完成每个其他的,你也无法实现你想要实现的标记(<p>
如果是array.empty ?, <ul>
,如果是array.present?)。此外,您在问题中显示的HAML是告诉代码背后故事的最佳方式,这意味着它对其他开发人员更具可读性和可维护性,因此我不知道您为什么要重构为更隐蔽的内容。
我认为没有更优雅或可读的方式来写这个。任何方式以某种方式将迭代与条件组合在一起只会产生黑盒子代码,这意味着:条件很可能隐藏在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,那么我们可以强制执行清空数组
if (array || []).each do |x|
#...
puts "x",x
end.empty?
puts "empty!"
end
我看到有些人询问如何处理这种情况。
诀窍是将其转换为字符串。转换为字符串的所有nils将变为空字符串,所有空案例将继续为空。
nil.to_s.empty?
"".to_s.empty?
两者都会回归真实