如何使用 Ruby 将解压缩的数组转换为单个值?
Posted
技术标签:
【中文标题】如何使用 Ruby 将解压缩的数组转换为单个值?【英文标题】:How to convert unpacked array to single value using Ruby? 【发布时间】:2012-04-02 10:45:41 【问题描述】:我正在尝试转换 4 字节数组的解压值?这在 Ruby 中可行吗?
假设我写了 b1 = b.unpack("N")
并打印了 b1
的值,即 1
。但是当我尝试使用 .to_i 将 b1 转换为某个整数时,控制台会抛出错误 test.rb:13: undefined method
to_i' for [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
【问题讨论】:
b1
是一个数组; to_i
是什么意思?如果你想要它作为一个整数,你需要使用b1[0]
。
【参考方案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
以后通过 print 语句调试你的程序时,使用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
【讨论】:
以上是关于如何使用 Ruby 将解压缩的数组转换为单个值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Postgres 中将布尔数组转换为单个布尔值或单个字符串
使用 PHP 中的 foreach 循环将数组值转换为单个数组