Ruby中 << 的相反操作是什么?

5

我有一个通过在循环中使用<<运算符准备的巨大字符串。最后,我想删除最后2个字符。

some_loop
  str << something
end
str = str[0..-3]

我认为上面的最后一个操作也会消耗内存和时间,但我不确定。我只是想看看是否有一种与 << 相反效果的操作,以便我可以从同一个字符串中删除那两个字符。

3个回答

8
事实上,字符串切片已经是一种快速且内存高效的操作,因为字符串内容只有在真正需要时才会被复制。
请参见“Seeing double: how Ruby shares string values”中的详细解释。
请注意,这是一种相当经典的字符串操作优化;Java中也有类似的技巧,我们在C中也经常使用类似的技巧。
因此,请毫不犹豫地执行以下操作:
str = str[0..-3]

那是正确的、推荐的和高效的方法,前提是你确实需要删除那些字符,请参考Sergio的回答。

+1 对于上面粘贴的链接 -> http://patshaughnessy.net/2012/1/18/seeing-double-how-ruby-shares-string-values - Amol Pujari

3

您是否正在使用分隔符连接某些数组元素?类似于这样的操作:

names = ['Mary', 'John', 'Dave']

res = ''
names.each do |n|
  res << n << ', '
end

res # => 'Mary, John, Dave, '

如果是的话,那么有更简单的方法。
names.join(', ') # => 'Mary, John, Dave'

是的,使用, 连接一些数组元素。但是,我知道我应该自己进行一些基准测试,但仍然想听听关于在数据字符串太多和太大时调用join可能有多糟糕的快速评论。 - Amol Pujari
那么这个答案就是为你准备的 :) - Sergio Tulentsev

1
如果最后两个字符是换行符(CR/LF),您可以使用String.chomp(或String#chomp!如果您想修改字符串)。
否则,您可以使用:
2.times{ string.chop! }

或者

string.chop!
string.chop!

为什么在文本中提到 chomp 并使用 chop 给出示例? - sawa
1
chomp 用于去除 CR/LF。chop 的示例在 'else' 部分(它会删除最后一个字符)。 - knut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接