我有这段代码:
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}"]
}
但是效果不好。
答案 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]
}