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

2024-04-01

这个问题的灵感来自于这个问题:Ruby:为什么这种使用地图的方式会抛出错误? https://stackoverflow.com/questions/41853364/ruby-why-does-this-way-of-using-map-throw-an-error/41853662?noredirect=1#comment70891676_41853662

有人指出了以下几点:

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

您应该:

  • 将地图与 gsub 一起使用
  • 或者将每个与 gsub 一起使用!

有人可以解释这是为什么吗?


基础对象

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

words = ['hello', 'world']

新阵列

如果您想要一个带有修改后的字符串的新数组,您可以使用map with 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!

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将表明您不想修改现有对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby:#map 对于 bang 方法通常没有意义,是吗? 的相关文章

随机推荐