Feature #20176
open
Array#pack: support offset kwarg
Added by chucke (Tiago Cardoso) 11 months ago.
Updated 11 months ago.
Description
I was changing some code to use ruby 3.3's new buffer
kwarg (great addition btw!) when using Array#pack
. There are a few cases however, where I could perform the change, as not all my usages rely on appending; in some, I'm actually prepending it.
To solve this, I'd like to propose the offset
kwarg, which declares where to add the resulting string. picking up on example from the docs:
[65, 66].pack('C*', buffer: 'foo') # => "fooAB"
[65, 66].pack('C*', buffer: 'foo', offset: 0) # => "ABfoo"
[65, 66].pack('C*', buffer: 'foo', offset: 1) # => "fABoo"
I don't think this could be implemented more efficiently than doing buffer.insert offset, array.pack(format)
.
Notably because in general the length of the produced string is unknown before packing.
So then I think this is not worth adding.
There's also String#prepend
. Not sure if more efficient than str.insert(0,
(and if not, what was the argument for adding it back then?), but that's certainly another argument, in that, by reusing the offset
kwarg from String.unpack
, it'd reduce the special cases one would need to handle. Right now, because of the lack of such a kwarg, i have to maintain my aux method to handle the several cases:
def pack(array_to_pack, template, buffer:, offset: -1)
case offset
when -1
array_to_pack.pack(template, buffer: buffer) # ideal scenario
when 0
buffer.prepend(array_to_pack.pack(template))
else
buffer.insert(offset, array_to_pack.pack(template))
end
end
Also available in: Atom
PDF
Like0
Like0Like0