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

发布于 2024-10-16 09:57:11 字数 591 浏览 0 评论 0原文

我有这样的代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

请持续率性 2024-10-23 09:57:11
array.reject! { |item| flash[item.to_sym] }
array.reject! { |item| flash[item.to_sym] }
め可乐爱微笑 2024-10-23 09:57:11

发生这种情况是因为您正在修改要迭代的数组。
像这样的东西应该可以工作

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

尝试在示例输入上使用和不使用clone来运行它

array = ['notice', 'warning', 'error']
flash = {:warning => 1, :error => 2}

...

p array

但是不需要手动调用delete,您只需用户拒绝

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

That happens because you're modifying array over which you iterate.
Something like this should work

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

Try running it with and without clone on sample input

array = ['notice', 'warning', 'error']
flash = {:warning => 1, :error => 2}

...

p array

But there's no need to invoke delete manually, you can just user reject:

array = array.reject! { |item| flash[:"#{item}"] }
深爱不及久伴 2024-10-23 09:57:11

不需要使用字符串插值,只需使用 .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]
}

You don't need to use string interpolation, just convert the strings to symbols using .to_sym:

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

Or use symbols in array to .to_s in the delete:

array = [:notice, :warning, :error]
array.each { |item|
    array.delete(item.to_s) if flash[item]
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文