From: mame@... Date: 2021-03-27T09:07:51+00:00 Subject: [ruby-core:103056] [Ruby master Misc#17751] Do these instructions (<<, +, [0..n]) modify the original string without creating copies? Issue #17751 has been updated by mame (Yusuke Endoh). Status changed from Open to Closed > When you say **"may take a long time"** does it apply even if **'str'** is 3GB and **'header'** is only 5bits? Yes, it does. `String#prepend` need to memmove the content of `str`, which may take time proportional to the length of `str`. > Another solution to my problem would be to be able to write data to a file from any position I want (in bits) by replacing its content. Well, do you really want to deal with bits, not bytes? If so, you cannot simply use Strings because they are byte-oriented (or character-oriented). From only your statements, I think you need to implement a bit stream. `String#getbyte` and `String#setbyte` may be helpful to do that. (BTW, your question looks like https://en.wikipedia.org/wiki/XY_problem to me. I recommend you to state what you want to do eventually.) Anyway, this issue tracker is for bug reports and improvement proposals. If you want to ask a question, please use ruby-talk@ruby-lang.org (See https://www.ruby-lang.org/en/community/mailing-lists/), or Q&A site like stackoverflow. ---------------------------------------- Misc #17751: Do these instructions (<<,+,[0..n]) modify the original string without creating copies? https://bugs.ruby-lang.org/issues/17751#change-91117 * Author: stiuna (Juan Gregorio) * Status: Closed * Priority: Normal ---------------------------------------- In my program a string increases considerably in size inside a loop, at the end of that loop a header is created that will have to go to the beginning of that string. During the whole loop: ``` ruby str << "some data" ``` At the end: ``` ruby header = "other data" str = header + str ``` I understand that using (+) creates a copy to then modify the original variable, that is not desirable, I would like to do something similar to (<<), which I understand does not create copies. If I do this: ``` ruby header << str ``` I would have two variables with a very large size. I also have this other code and I don't know if it is an "in place" modifier: ``` ruby str = "12345" str[0..2] = "" #s => 45 ``` In short, I want to know what instructions I should use to remove a given range from a string and how to concatenate to both the beginning and end of the target string without having to create copies. -- https://bugs.ruby-lang.org/ Unsubscribe: