重构ruby代码以将数组拆分为两个小数组

时间:2014-08-26 17:13:29

标签: ruby ruby-on-rails-4

  @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

我可以用不那么冗长的方式写出来吗?

4 个答案:

答案 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方法。

相关问题