@open = Array.new
@close = Array.new
@posts.each do |post|
if !post.status.nil? and post.status == 'Open'
@open.push(post)
else
@close.push(post)
end
end
我可以用不那么冗长的方式写出来吗?
答案 0 :(得分:9)
听起来像是partition
的工作:
分区{| obj |阻止}→[true_array,false_array]
分区→an_enumerator返回两个数组,第一个包含 enum 的元素,其中块的计算结果为true,第二个包含其余数据。
这应该做的工作:
@open, @closed = @posts.partition { |p| p.status == 'Open' }
答案 1 :(得分:1)
另一个想法:
@open = @post.select{ |post| post.status == 'Open'}
@close = @post.reject{ |post| post.status == 'Open'}
答案 2 :(得分:0)
您不必检查nil显式。这样的事情就可以了。
@posts.each { |post| post.status == 'Open' ? @open.push post : @close.push }
答案 3 :(得分:0)
只是为了帮助您编写更像Ruby的代码,以下是我编写原始代码的方式:
open_ary = []
close_ary = []
@posts.each do |post|
if post.status && post.status == 'Open'
open_ary << post
else
close_ary << post
end
end
它可以写得更简洁,并且会删除几行,但它会失去可读性,这总是需要考虑的事情。也就是说,@ muistooshort的答案确实是最好的方法,因为它依赖于为这种用例创建的partition
方法。