22

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
4

7 回答 7

35

关于什么?

array.each do |x|
  #...
  puts "x",x
end.empty? and begin
  puts "empty!"
end
于 2013-09-12T18:58:56.800 回答
6

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

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

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

即使您可以在一条干净的行中执行每个其他操作,您也无法实现您想要实现的标记(<p>如果 array.empty?,<ul>如果 array.present?)。此外,您在问题中显示的 HAML 是讲述代码背后故事的最佳方式,这意味着它对其他开发人员来说更具可读性和可维护性,所以我不知道您为什么要重构为更神秘的东西.

于 2014-01-05T04:48:41.020 回答
2

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

于 2013-05-31T15:18:16.190 回答
2

如果array为空,则不会被迭代,因此该each块不需要条件化。由于 的返回值each是接收者,因此您可以将each块放在empty?条件内。

if (array.each do |el|
  # process el
end).empty?
  # process empty array
end
于 2013-05-31T16:33:30.717 回答
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 } 
于 2013-05-31T15:20:59.967 回答
0

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

if (array || []).each do |x|
  #...
  puts "x",x
end.empty?
  puts "empty!"
end
于 2019-03-29T09:41:57.280 回答
-1

我看到有人问如何处理 nil 的情况。

诀窍是将其转换为字符串。所有转换为字符串的 nil 都变为空字符串,所有空情况继续为空。

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

两者都将返回 true

于 2017-10-03T11:44:02.287 回答