在下列情况下,如何改进代码以删除数组中的项?

时间:2011-02-05 17:59:41

标签: ruby interpolation

我有这段代码:

array = ['notice', 'warning', 'error']

array.delete('notice')  if flash[:notice]
array.delete('warning') if flash[:warning]
array.delete('error')   if flash[:error]

由于有重复的名称,为了缩短代码,我可以使用插值来执行这部分代码:

array.delete('notice')  if flash[:notice]
array.delete('warning') if flash[:warning]
array.delete('error')   if flash[:error]

如何一步完成?


我试过这个

array.each { |item|
  array.delete("#{item}") if flash[:"#{item}"]
}

但是效果不好。

3 个答案:

答案 0 :(得分:1)

array.reject! { |item| flash[item.to_sym] }

答案 1 :(得分:0)

这是因为您正在修改迭代的数组 这样的事情应该有效

array.clone.each { |item|
  array.delete("#{item}") if flash[:"#{item}"]
}

尝试在样本输入

上使用和不使用clone运行它
array = ['notice', 'warning', 'error']
flash = {:warning => 1, :error => 2}

...

p array

但是无需手动调用delete,您只需用户reject

array = array.reject! { |item| flash[:"#{item}"] }

答案 2 :(得分:0)

您不需要使用字符串插值,只需使用.to_sym将字符串转换为符号:

array = ['notice', 'warning', 'error']
array.each { |item|
    array.delete(item) if flash[item.to_sym]
}

或者在删除中使用array.to_s中的符号:

array = [:notice, :warning, :error]
array.each { |item|
    array.delete(item.to_s) if flash[item]
}