在以下情况下如何改进代码以删除数组中的项目?
我有这样的代码:
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]
如何一步完成?< /strong>
我尝试过这个
array.each { |item|
array.delete("#{item}") if flash[:"#{item}"]
}
,但效果不佳。
I have this code:
array = ['notice', 'warning', 'error']
array.delete('notice') if flash[:notice]
array.delete('warning') if flash[:warning]
array.delete('error') if flash[:error]
Since there are repeated names, in order to shorten the code, I could use the interpolation to perform this part of code:
array.delete('notice') if flash[:notice]
array.delete('warning') if flash[:warning]
array.delete('error') if flash[:error]
How can I do that in one step?
I tryed this
array.each { |item|
array.delete("#{item}") if flash[:"#{item}"]
}
but it doesn't work good.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
发生这种情况是因为您正在修改要迭代的数组。
像这样的东西应该可以工作
尝试在示例输入上使用和不使用
clone
来运行它但是不需要手动调用
delete
,您只需用户拒绝:That happens because you're modifying array over which you iterate.
Something like this should work
Try running it with and without
clone
on sample inputBut there's no need to invoke
delete
manually, you can just user reject:不需要使用字符串插值,只需使用
.to_sym
将字符串转换为符号即可:或者使用
array
中的符号到.to_s
中删除:You don't need to use string interpolation, just convert the strings to symbols using
.to_sym
:Or use symbols in
array
to.to_s
in the delete: