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 

关于什么?

 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子句,因为这已经隐含在其他逻辑中了。

即使你可以在一个简洁的行中执行each-else,你也无法实现你想要实现的标记(

如果是array.empty?,

    如果是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 } 

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

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

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

    两者都会回归真实