Как преобразовать распакованный массив в одно значение с помощью Ruby?
Я пытаюсь преобразовать распакованное значение в 4 байта массива? Возможно ли это в Ruby?
скажи я написал b1 = b.unpack("N")
и напечатать значение b1
который 1
, Но когда я пытаюсь преобразовать b1 в какое-то целое число, используя.to_i, консоль выдает ошибку test.rb:13: undefined method
to_i'для [118]:Array (NoMethodError)`
Мой код следующий:
File.open('testfile','rb') do |file|
file.read.scan(/(.{4})(.{4})(.{4})(.*\w)(.{8})/).each do |a,b,c,d,e|
if a == "cook"
puts "test1"
else
puts "test2"
end
puts "output1"
b1 = b.unpack("N")
puts "output2"
c1 = c.unpack("N")
puts "output3"
puts "output4"
puts "output5"
end
end
1 ответ
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