【问题标题】:Why are << and += building a different string? [duplicate]为什么 << 和 += 构建不同的字符串? [复制]
【发布时间】:2015-07-29 04:18:25
【问题描述】:

我编写了一个函数,它逐个字符地迭代字符串,使用每个字符作为键从哈希中提取值。散列中的值用于构建新字符串:

acc = ''
str.each_char do |c|
  acc << somehash[c]
end

如果字符串长于一个,则将查找第一个字符并将其哈希值插入到构建的字符串中多次,这不是我想要的。我用&lt;&lt; 重写了这一行

acc += somehash[c]

并且它的行为正确。 为什么我的行为与 &lt;&lt;+= 不同?

注意:我不再出现这种行为,并且我的单元测试正在通过。我不知道为什么,因为我没有触及循环中的逻辑。

【问题讨论】:

  • String#&lt;&lt; 使用相同的字符串,str = str + 'a' 将结果重新分配给新创建的字符串对象。我无法意识到,您的代码如何产生您所描述的行为。
  • 老实说,我会选择acc = str.chars.map{|c| somehash[c]}.join,它更干净,并且会产生相同的结果。或者更好acc = somehash.values_at(*str.split(//)).join
  • @mudasobwa 是的,我就是这么想的。直到今天我的单元测试发现了奇怪的插值时,我一直很高兴地使用 '
  • 我很困惑,因为在继续编码几个小时后,我切换回了铲子,现在我的单元测试很好。我希望我知道原因,因为我没有改变循环的逻辑。

标签: ruby string


【解决方案1】:

s1 &lt;&lt; s2 将字符串s2 附加到s1,而s1 += s2 扩展为s1 = s1 + s2,创建了一个新对象,该对象成为变量s1 的新值。

考虑以下内容。

s1 = "ab"
s1.object_id #=> 70117580969460 
s2 = "cd"

s1 << s2     #=> "abcd" 
s1           #=> "abcd" 
s1.object_id #=> 70117580969460 

比较一下:

s1 = "ab"
s1.object_id #=> 70117576935280 
s2 = "cd"

s1 += s2     #=> s1 = s1 + s2 => "abcd" 
s1           #=> "abcd" 
s1.object_id #=> 70117576870900 

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多