提问人:Alon Dor 提问时间:4/27/2023 更新时间:4/27/2023 访问量:39
在 Ruby 中迭代时删除或更新数组中的对象
Remove or update objects in array while iterating in Ruby
问:
我正在寻找一种有效的方法来遍历对象数组,并根据某些条件更新属性或删除对象或保持原样。 例如,假设我有一个 Persons 数组,每个人都有姓名和年龄,我想遍历该数组并删除 40 岁以上的人,将“_child”附加到 10 岁以下的人的名称中,并保留其余的人。 我可以做:
persons.delete_if{|p| p.age > 40}
persons.each{|p| p.name = "#{p.name}_child" if p.age < 10}
但是有没有一种聪明的方法可以将它们结合起来呢?
答:
3赞
Sergio Tulentsev
4/27/2023
#1
实际上,有。(红宝石 2.7+)
persons = persons.filter_map do |p|
if p.age <= 40
p.name += "_child" if p.age < 10
p
end
end
但我个人会把它们分开
persons = persons
.reject{|p| p.age > 40}
.each{|p| p.name += "_child" if p.age < 10 }
评论
0赞
Tom Lord
4/27/2023
根据您的建议:即使是该代码对我来说也很奇怪,因为它在一个地方做多件事!(好代码的一个关键原则是每个方法/函数应该只做一件事。从列表中删除“老”人并更改列表中“年轻”人的名字对我来说感觉像是两个完全不同的操作,我很可能会避免将这些方法调用直接链接在一起。
0赞
Sergio Tulentsev
4/27/2023
@TomLord:这是一个很好的观点!
0赞
Alon Dor
4/27/2023
我只是想避免在同一个数组上迭代两次。这只是一个例子,在我的代码中,这两个操作之间存在关系,两者都是删除对象,要么完全删除它,要么将其标记为已删除。
评论