Ruby中遍历数组时如何高效移除或更新对象?
可以用keep_if把两个操作合并成一次遍历,既完成元素筛选又处理属性修改,代码更简洁高效:
persons.keep_if do |p| if p.age > 40 false else p.name += "_child" if p.age < 10 true end end
说明:
keep_if会遍历数组中的每个元素,返回true则保留该元素,返回false则移除,刚好替代delete_if的逻辑;- 在判断保留的分支里,顺便处理年龄小于10的对象的
name属性修改; - 相比原来两次遍历数组的写法,这种方式只遍历一次,性能更优,代码也更紧凑。
如果希望生成新数组而不是原地修改原数组,可以用filter_map:
new_persons = persons.filter_map do |p| next nil if p.age > 40 p.name += "_child" if p.age < 10 p end
注意:上面的代码会修改原数组中对象的属性,如果需要不改动原对象,可以先复制对象再修改,比如用
dup和tap:new_persons = persons.filter_map do |p| next nil if p.age > 40 p.dup.tap { |dup_p| dup_p.name += "_child" if dup_p.age < 10 } end
内容的提问来源于stack exchange,提问作者Alon Dor
相关产品推荐
相关产品推荐

