这个问题的灵感来自于这个问题: Ruby: Why does this way of using map throw an error?
有人指出了以下几点:
map 与 ! 一起使用时没有多大意义。方法。
您应该:
- 通过 gsub 使用 map
- 或者将每个与 gsub 一起使用!
谁能解释一下这是为什么吗?
最佳答案
基础对象
这是一个以字符串为元素的数组:
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"]
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/