代码之家  ›  专栏  ›  技术社区  ›  Rajagopalan

如何用Ruby风格替换这个nil值

  •  0
  • Rajagopalan  · 技术社区  · 5 年前

     A=[[a,x,y,z],[nil,e,f,d],[nil,k,j,u],[nil,w,p,k],[b,x,y,z],[nil,e,f,d],[nil,k,j,u],[nil,w,p,k]]
    

    结果

     A=[[a,x,y,z],[a,e,f,d],[a,k,j,u],[a,w,p,k],[b,x,y,z],[b,e,f,d],[b,k,j,u],[b,w,p,k]]
    

    您可能注意到第一个数组的第一个字符正在替换即将到来的nil值,直到第一个数组的第一个字符是b,然后nil值被替换为b。

    这是我通过迭代数组并编写if条件并将第一个字符存储在某处,然后在迭代时比较第一个字符来实现的。但我还是找不到一个鲁比的方式来做这件事。有人能帮我吗

    1 回复  |  直到 5 年前
        1
  •  2
  •   Cary Swoveland    5 年前
    arr = [['a',1,2],[nil,3,4],[nil,5,6],[nil,7,8],['b',9,10],[nil,11,12],[nil,13,14]]
    

    last = nil
    arr.map do |f,*rest|
      if f.nil?
        [last, *rest]
      else
        last = f
        [f, *rest]
      end
    end
      #=> [["a", 1, 2], ["a", 3, 4], ["a", 5, 6], ["a", 7, 8],
      #    ["b", 9, 10], ["b", 11, 12], ["b", 13, 14]] 
    

    步骤如下:

    last = nil
    enum = arr.map
      #=> #<Enumerator: [["a", 1, 2], [nil, 3, 4], [nil, 5, 6], [nil, 7, 8],
      #                  ["b", 9, 10], [nil, 11, 12], [nil, 13, 14]]:map> 
    f,*rest = enum.next
      #=> ["a", 1, 2]
    f #=> "a"
    rest
      #=> [1, 2] 
    f.nil?
      #=> false 
    last = f
      #=> "a" 
    [f, *rest]
      #=> ["a", 1, 2] 
    
    f,*rest = enum.next
      #=> [nil, 3, 4] 
    f.nil?
      #=> true 
    [last, *rest]
      #=> ["a", 3, 4] 
    
    f,*rest = enum.next
      #=> [nil, 5, 6] 
    f.nil?
      #=> true 
    [last, *rest]
      #=> ["a", 5, 6] 
    
    f,*rest = enum.next
      #=> [nil, 7, 8] 
    f.nil?
      #=> true 
    [last, *rest]
      #=> ["a", 7, 8] 
    

    等等。

    arr.drop(1).each_with_object([arr.first]) { |a,ar|
      ar << [a.first || ar.last.first, *a.drop(1)] }
      #=> [["a", 1, 2], ["a", 3, 4], ["a", 5, 6], ["a", 7, 8],
      #    ["b", 9, 10], ["b", 11, 12], ["b", 13, 14]] 
    

        2
  •  3
  •   steenslag    5 年前
    A = [['a',1,2],[nil,3,4],[nil,5,6],[nil,7,8],['b',9,10],[nil,11,12],[nil,13,14]]
    
    A.each_cons(2){|first, last| last[0] ||= first[0] }
    

    last[0] ||= first[0] 意思是“给最后一个[0]第一个[0]的值,除非它已经有一个值(不是nil或false)”。