Ruby最佳实践:如果不是空的,则在一个运算符中执行其他操作

问题描述 投票:16回答:7

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
ruby operators haml
7个回答
25
投票

关于什么?

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

5
投票

我在HAML(不是普通的Ruby)中看到的最干净的方法是这样的:

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

正如其他答案所提到的,不需要else子句,因为这已经隐含在其他逻辑中了。

即使你可以在一个简洁的行中完成每个其他的,你也无法实现你想要实现的标记(<p>如果是array.empty ?, <ul>,如果是array.present?)。此外,您在问题中显示的HAML是告诉代码背后故事的最佳方式,这意味着它对其他开发人员更具可读性和可维护性,因此我不知道您为什么要重构为更隐蔽的内容。


2
投票

我认为没有更优雅或可读的方式来写这个。任何方式以某种方式将迭代与条件组合在一起只会产生黑盒子代码,这意味着:条件很可能隐藏在Array扩展中。


2
投票

如果array为空,那么它将不会被迭代,因此each块不需要被调节。由于each的返回值是接收器,你可以将each块放在empty?条件下。

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

1
投票

假设“进程空数组”在处理后将其留空,则可以省略其他:

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

或者在一行中:

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

0
投票

如果数组为nil,那么我们可以强制执行清空数组

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

-1
投票

我看到有些人询问如何处理这种情况。

诀窍是将其转换为字符串。转换为字符串的所有nils将变为空字符串,所有空案例将继续为空。

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

两者都会回归真实

© www.soinside.com 2019 - 2024. All rights reserved.