Ruby:map通常不会';使用bang方法没有意义吗?

Ruby:map通常不会';使用bang方法没有意义吗?,ruby,Ruby,这个问题的灵感来自于这个问题: 有人指出, 地图与一起使用时没有多大意义!方法。 你应该: 与gsub一起使用map 或者与gsub一起使用 有人能解释为什么会这样吗?Map用于在不改变原始阵列的情况下构建新阵列。每个用于对数组的每个元素执行某些操作。同时做这两件事是令人惊讶的 >> arr = ["foo bar", "baz", "quux"] => ["foo bar", "baz", "quux"] >> arr.map{|x| x.gsub!(' '

这个问题的灵感来自于这个问题:

有人指出,

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

你应该:

  • 与gsub一起使用map
  • 或者与gsub一起使用

有人能解释为什么会这样吗?

Map用于在不改变原始阵列的情况下构建新阵列。每个用于对数组的每个元素执行某些操作。同时做这两件事是令人惊讶的

>> arr = ["foo bar", "baz", "quux"]
=> ["foo bar", "baz", "quux"]
>> arr.map{|x| x.gsub!(' ', '-')}
=> ["foo-bar", nil, nil]
>> arr
=> ["foo-bar", "baz", "quux"]
从那时起-方法通常会有副作用(并且只是偶然地可能返回一个值),
在调用-方法

例外情况可能是当您有要执行的操作列表时。执行该操作的方法可以合理地命名为
,但您希望收集结果,以便报告哪些结果成功或失败。

Base object 以下是一个以字符串作为元素的数组:

words = ['hello', 'world']
新阵列 如果您想要一个带有修改字符串的新数组,可以将
map
gsub
一起使用:

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"]
地图和gsub! 这里创建了一个新数组,但元素完全相同

它只带来了前面的例子。它会免费创建一个新数组。它还可能通过发送相反的信号来迷惑阅读您代码的人:

  • gsub将指示您要修改现有对象
  • map
    将指示您不想修改现有对象
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