Project

General

Profile

Actions

Feature #20176

open

Array#pack: support offset kwarg

Added by chucke (Tiago Cardoso) 4 months ago. Updated 4 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:116152]

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"

Updated by Eregon (Benoit Daloze) 4 months ago

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.

Updated by chucke (Tiago Cardoso) 4 months ago

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
Actions

Also available in: Atom PDF

Like0
Like0Like0