Расчет размера структурного формата пакета Array в Ruby - PullRequest
2 голосов
/ 20 декабря 2010

Например, ddddd, d - это собственный формат системы, поэтому я не могу точно знать, насколько большим он будет.

В Python я могу сделать:

import struct
print struct.calcsize('ddddd')

Что вернет 40.

Как мне получить это в Ruby?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Я не нашел встроенного способа сделать это, но у меня был успех с этой маленькой функцией, когда я знаю, что имею дело только с числовыми форматами:

  def calculate_size(format)
    # Only for numeric formats, String formats will raise a TypeError
    elements = 0
    format.each_char do |c|
      if c =~ /\d/
        elements += c.to_i - 1
      else
        elements += 1
      end
    end
    ([ 0 ] * elements).pack(format).length
  end

Это создает массив из правильного числа нулей, вызывает pack () с вашим форматом и возвращает длину (в байтах). Нули работают в этом случае, потому что они могут быть преобразованы в каждый из числовых форматов (целое, двойное, число с плавающей точкой и т. Д.).

0 голосов
/ 20 декабря 2010

Я не знаю ярлыка, но вы можете просто упаковать его и спросить, как долго это будет:

length_of_five_packed_doubles = 5 * [1.0].pack('d').length

Кстати, массив ruby ​​в сочетании с методом pack функционально эквивалентен структурному модулю python. Ruby в значительной степени скопировал Perl pack и поместил их как методы в класс Array.

...