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?
两者都会回归真实