String#unpack
всегда возвращает массив, даже если есть только одно значение:
irb:01> s = "\x0\x0\x0*"
#=> "\u0000\u0000\u0000*"
irb:02> v = s.unpack('N')
#=> [42]
irb:03> v.class
#=> Array
Вы сбиты с толку, потому что когда вы puts
массиве, он выводит версию to_s
каждого значения в отдельной строке; в этом случае выглядит как одно число:
irb:04> puts v
#=> 42
irb:05> puts [1,2,3]
#=> 1
#=> 2
#=> 3
В будущем при отладке ваших программ с помощью операторов печати используйте p
вместо puts
, поскольку его вывод аналогичен исходному коду и предназначен для ясности:
irb:12> puts 42, "42", [42]
#=> 42
#=> 42
#=> 42
irb:13> p 42, "42", [42]
#=> 42
#=> "42"
#=> [42]
Как прокомментировал @Dave, вам нужно извлечь целое число из массива, чтобы действительно использовать его как целое число:
irb:06> i = v.first # or v[0]
#=> 42
irb:07> i.class
#=> Fixnum