如何在迭代数组时修改(添加/删除元素)数组并让迭代器知道它?
例如,我认为这段代码:
a = "1234567890".split("")
a.each_with_index{|d, i|
if d.eql?('5')
a.delete_at(i)
a.insert(i, ['A', 'B', 'C'] )
end
print d
}
会产生:1234ABC67890
但会产生1234567890
是否有解决方法或不同方法才能使其正常工作?
(我知道这个例子是非常简单的例子,但是我正在做一些复杂的文本处理,当我点击一个关键词时我需要插入一些文本。我会在做扩展之前和之后做一堆函数这样做每个循环外部的插入[aka map!
]会使我的代码变得复杂)
答案 0 :(得分:1)
实际上,您的代码有效,您只需要将print d
替换为print a[i]
,因为您要打印的是变量d
而不是索引{{1}处的实际数组元素}
为什么不更改该索引上的元素,而不是删除和插入?
i
或
a = "1234567890".split("")
a.each_with_index{|d, i|
if d.eql?('5')
a[i] = ['A','B','C']
end
print a[i] #a[i] rather than d, since d contains the old value
}
在迭代期间删除/插入数组是不鼓励的,因为它可能会导致令人头疼的问题...如果可能,请使用其他方法:)
注意: 我刚刚根据我的理解和给定的期望输出
使用了代码中的当前逻辑数组将变为[1,2,3,4,['A','B','C'],6,7,8,9,0]而不是[1,2,3,4] , 'A', 'B', 'C',6,7,8,9,0]。如果你想要另一个,只需发表评论:)
如果你想要的只是改变字符串中的值,你可以使用 ...
if d.eql?('5')
a[i] = ['A','B','C']
d = a[i]
end
print d
或.tr
来完成这项工作
答案 1 :(得分:0)
在迭代其成员时,通常无法修改Enumerable。在大多数此类情况下,您需要构建一个新的Enumerable。
b = []
a.each_with_index do |d, i|
if d.eql?('5')
b << 'A' << 'B' << 'C'
else
b << d
end
end
答案 2 :(得分:0)
这是一个选项。如果要返回数组,请删除join
,否则请将其保留为String
a = "1234567890".split("")
a.collect! {|i| i == '5' ? ['A', 'B', 'C'] : i }.flatten!.join #=> "1234ABC67890"
答案 3 :(得分:0)
最好避免在迭代时插入和删除。然而,当以相反的顺序迭代时,一些问题消失了:
a = "1234567890".split("")
a.reverse_each.with_index{|d, i|
if d.eql?('5')
a.delete_at(i)
a.insert(i, ['A', 'B', 'C'] )
end
}
puts a.join # => 12345ABC7890