
Issue #19314 has been updated by Eregon (Benoit Daloze). Eregon (Benoit Daloze) wrote in #note-5:
Now that we have IO::Buffer and there is https://docs.ruby-lang.org/en/master/IO/Buffer.html#method-i-copy, why not use that?
So this does what you want I believe: ```ruby x = "0123456789" IO::Buffer.for(x) do |buffer| buffer.copy(buffer, 2, 3, 6) end p x # => "0167856789" ``` I think there is no need to change `String#bytesplice` therefore (there is even not a need for `String#bytesplice` due to that, which [I think we shouldn't have added](https://bugs.ruby-lang.org/issues/18598#note-3)). And `IO::Buffer` seems better suited for byte-buffer-like operations. ---------------------------------------- Feature #19314: String#bytesplice should support partial copy https://bugs.ruby-lang.org/issues/19314#change-101081 * Author: shugo (Shugo Maeda) * Status: Open * Priority: Normal ---------------------------------------- String#bytesplice should support partial copy without temporary String objects. For example, given `x = "0123456789"`, either of the following replaces the contents of `x` with `"0167856789"`: ```ruby x.bytesplice(2, 3, x, 6, 3) x.bytesplice(2..4, x, 6..8) ``` ## Considerations * What should be the return value? * The return value should be the whole source string for performance and consistency with `bytesplice(offset, len, s)`. * Can the source and destination ranges overlap? * Yes. * Can the source and destination lengths be different? * Yes. * Can range form and offset/length form be mixed in the source and destination? * No. * What should happen when any offset doesn't land on character boundary in text strings. * IndexError should be raised. * Can the length be omitted in the destination? * Maybe yes, but it may be confusing. ## Use cases * [Gapped buffer implementation for text editors](https://github.com/shugo/textbringer) * [NAT implementation](https://github.com/kazuho/rat) * https://twitter.com/kazuho/status/1611279616098070532 -- https://bugs.ruby-lang.org/