如何裁剪字符串而不复制它

时间:2011-05-02 11:53:12

标签: ruby

我想从一个非常大的字符串的开头剪切一些字符。为了节省一些内存和时间,我想避免复制它,但只是让字符串从后面的索引开始,就像在C中通过递增指向字符串(数组)的指针一样容易实现。

这可能吗?

5 个答案:

答案 0 :(得分:5)

你无法播放“增加字符串指针”的技巧,但试试这个:

str = 'I would like to cut a number of characters from the beginning of a very large String'
str[0, 10] = ''
str # => "ke to cut a number of characters from the beginning of a very large String"

这是我知道在Ruby中删除部分字符串的最简单方法。

答案 1 :(得分:1)

由于Ruby代表字符串的方式,可能无法做你想做的事。

正如您所提到的,在C中,您可以通过一定数量的字符将指针增加到字符串。但是,在Ruby中,String类由struct RString实现,它具有基础C字符串的ptr字段。 Ruby提供一种增加ptr字段的方法是没有意义的,因为它会丢失对原始位置的跟踪并且会使该内存的重新分配变得复杂。您可以将自己的原生扩展编写为String类,它可以执行您想要的操作,但可能存在其他复杂情况(例如关于散列)。

答案 2 :(得分:0)

如果内存不是问题而您需要摆脱复制操作,为什么不构建自己的String类实现为数组:

class StringAsArray
    def initialize(s)
        @arr = s.split(//)
    end

    // .... your methods goes here ....

end

创建切割方法应该很容易。它非常天真的方法,可能不适合你。取决于你需要做什么。

答案 3 :(得分:0)

如果您知道要剥离的部分,则可以使用gsub!

s = 'cut this string'
s.gsub!('cut ', '')
s
# => "cut this string"

或者您可以使用slice!

s.slice!(s.index('this')..-1)
s
# => "cut this string"

答案 4 :(得分:0)

不完全确定String#reverse!不会在内部复制,但这是我过去使用的方法:

mystring.reverse!
num_of_chars.times {mystring.chop!}
mystring.reverse!

虽然我现在看着它,但我认为Tin Man有一个更优雅的解决方案。