
Issue #19314 has been updated by Eregon (Benoit Daloze). I think this is too hard to read and parse for a human and 5 arguments seems way too much for a core method. It feels like a full memcpy/arraycopy which I don't think in general is a good idea for String. The implementation complexity in []= and similar already hurts Ruby too much. This is probably the 3rd or more workaround I see to have proper lazy substrings in CRuby, i.e., `"abcdef"[1..3]` must not copy bytes. That is what needs to be solved (it already works in TruffleRuby). Yes, it means RSTRING_PTR() might need to allocate to \0-terminate, so be it, it's worth it. So I am strongly against this, it's a nth workaround for something simpler to solve which is much more helpful in general. ---------------------------------------- Feature #19314: String#bytesplice should support partial copy https://bugs.ruby-lang.org/issues/19314#change-101071 * 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/