как обрезать строку без ее копирования - PullRequest
1 голос
/ 02 мая 2011

Я хотел бы вырезать несколько символов из начала очень большой строки. Чтобы сэкономить мне память и время, я бы хотел не делать его копию, а просто позволить строке начинаться с этого более позднего индекса, как это было бы легко сделать в C, просто увеличив указатель на строку (массив).

Это возможно?

Ответы [ 5 ]

5 голосов
/ 02 мая 2011

Вы не можете сыграть трюк «увеличить указатель строки», но попробуйте это:

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 голос
/ 02 мая 2011

Вероятно, невозможно сделать то, что вы хотели бы, из-за того, как Ruby представляет строки.

Как вы упомянули, в C вы можете просто увеличить указатель на строку на некоторое количество символов.Однако в Ruby класс String реализован с помощью struct RString, который имеет поле ptr для базовой строки C.Для Ruby не имеет смысла предоставлять метод, который увеличивает поле ptr, потому что он потеряет исходное местоположение и усложнит освобождение этой памяти.Возможно, вы сможете написать свое собственное собственное расширение для класса String, которое делает то, что вы хотите, но, вероятно, существуют дополнительные сложности (например, в отношении хеширования).

0 голосов
/ 03 мая 2011

Не совсем уверен, что String # обратный! не копирует внутри, но этот метод я использовал в прошлом:

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

Хотя теперь, когда я смотрю на это, я думаю, у Жестянщика есть более элегантное решение.

0 голосов
/ 02 мая 2011

Вы можете использовать gsub!, если вам известна часть для удаления.

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

или вы можете использовать slice!

s.slice!(s.index('this')..-1)
s
# => "cut this string"
0 голосов
/ 02 мая 2011

Если с памятью нет проблем, и вам нужно избавиться от операции копирования, почему бы не создать собственный класс String, реализованный в виде массива:

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

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

end

Должно быть легко создавать методы резки и т. Д. Это очень наивный подход и, возможно, вам не подойдет. Зависит от того, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...