如何在Ruby风格中替换此nil值

如何在Ruby风格中替换此nil值,ruby,Ruby,我有一个类似的数组 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,然后ni

我有一个类似的数组

 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条件并将第一个字符存储在某处,然后在迭代时比较第一个字符而实现的。但我仍然没有找到一种ruby的方法来实现这一点。有人能帮我吗

arr = [['a',1,2],[nil,3,4],[nil,5,6],[nil,7,8],['b',9,10],[nil,11,12],[nil,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] 
last=nil
enum=arr.map
#=> # 
f、 *rest=enum.next
#=>[“a”,1,2]
f#=>“a”
休息
#=> [1, 2] 
f、 零?
#=>错误
last=f
#=>“a”
[f,*其余]
#=>[“a”,1,2]
f、 *rest=enum.next
#=>[nil,3,4]
f、 零?
#=>正确
[最后,*休息]
#=>[“a”,3,4]
f、 *rest=enum.next
#=>[nil,5,6]
f、 零?
#=>正确
[最后,*休息]
#=>[“a”,5,6]
f、 *rest=enum.next
#=>[nil,7,8]
f、 零?
#=>正确
[最后,*休息]
#=>[“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]] 
arr.drop(1)。每个_与_对象([arr.first]){a,ar|
ar[“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] 
last=nil
enum=arr.map
#=> # 
f、 *rest=enum.next
#=>[“a”,1,2]
f#=>“a”
休息
#=> [1, 2] 
f、 零?
#=>错误
last=f
#=>“a”
[f,*其余]
#=>[“a”,1,2]
f、 *rest=enum.next
#=>[nil,3,4]
f、 零?
#=>正确
[最后,*休息]
#=>[“a”,3,4]
f、 *rest=enum.next
#=>[nil,5,6]
f、 零?
#=>正确
[最后,*休息]
#=>[“a”,5,6]
f、 *rest=enum.next
#=>[nil,7,8]
f、 零?
#=>正确
[最后,*休息]
#=>[“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]] 
arr.drop(1)。每个_与_对象([arr.first]){a,ar|
ar[“a”,1,2],“a”,3,4],“a”,5,6],“a”,7,8],
#[“b”,9,10],“b”,11,12],“b”,13,14]]
last[0]| |=first[0]
的意思类似于“给last[0]first[0]的值,除非它已经有一个值(不是nil或false)”


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

请注意,nil以外的元素(例如x和y)是变量或方法。您确定不希望它们是文字(例如:x或“x”或7等)?Cary Swoveland 5分钟前注意到除nil以外的元素(例如x和y)是变量或方法。您确定不希望它们是文字(例如:x或“x”或7等)吗-Cary Swoveland 5分钟前非常感谢。第二个是一个非常漂亮的解决方案。非常感谢。第二个是一个非常漂亮的解决方案。我个人觉得
第一个和
最后一个
的名字有点让人困惑,我会简单地称它们为
a
b
。这是一个非常好的主意,也非常有趣更简单。聪明!我没有注意到OP想要变异
A
。我个人觉得
第一个
最后一个
的名字有点混乱,只会简单地称它们为
A
b
。这也是一个令人惊讶的想法,而且非常简单。聪明!我没有注意到OP想要变异
A