Ruby:#map 对于 bang 方法通常没有意义,是吗?

标签 ruby

这个问题的灵感来自于这个问题: Ruby: Why does this way of using map throw an error?

有人指出了以下几点:

map 与 ! 一起使用时没有多大意义。方法。

您应该:

  • 通过 gsub 使用 map
  • 或者将每个与 gsub 一起使用!

谁能解释一下这是为什么吗?

最佳答案

基础对象

这是一个以字符串为元素的数组:

words = ['hello', 'world']

新数组

如果您想要一个带有修改后的字符串的新数组,您可以将 mapgsub 一起使用:

new_words = words.map{|word| word.gsub('o','#') }

p new_words
#=> ["hell#", "w#rld"]
p words
#=> ["hello", "world"]
p new_words == words
#=> false

原始字符串和原始数组未修改。

就地修改字符串

如果你想修改字符串,你可以使用:

words.each{|word| word.gsub!('o','#') }
p words
#=> ["hell#", "w#rld"]

map 和 gsub!

new_words = words.map{|word| word.gsub!('o','#') }
p words
#=> ["hell#", "w#rld"]
p new_words
#=> ["hell#", "w#rld"]
p words == new_words
#=> true
p new_words.object_id
#=> 12704900
p words.object_id
#=> 12704920

这里创建了一个新数组,但元素是完全相同的!

它没有带来比前面的例子更多的东西。它无缘无故地创建了一个新数组。它还可能会通过发送相反的信号来迷惑阅读您代码的人:

  • gsub! 将表明您要修改现有对象
  • map 将表明您不想修改现有对象。

关于Ruby:#map 对于 bang 方法通常没有意义,是吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41854955/

相关文章:

ruby - 尝试通过 https 发出发布请求时获取 OpenSSL::SSL::SSLError: SSL_set_tlsext_host_name

Ruby - 如何在返回字符串中的所有偶数值时保留空格?

ruby - 在 RSpec 中检查(不存在) `puts`

ruby-on-rails - 除非再次查询,否则 Rails Carrierwave url 为 nil

ruby-on-rails - config/application.rb 下的 I18n 配置被忽略

ruby-on-rails - 通过 Axlsx 添加到电子表格时正确设置 Excel 列宽

ruby - 使用 Ruby SDK 从 SNS 接收消息时的 AWS SQS JSON 格式

ruby - 计算数组数组中的元素

ruby-on-rails - 在firefox中网站被重定向到 "https"(其他浏览器正常)

javascript - 如何编写脚本来编辑 JSON 文件?