在ruby中解压缩一组记录/字段

时间:2014-08-02 01:04:00

标签: ruby-on-rails arrays

解压缩由rails生成的阵列时遇到问题。该阵列看起来没问题,但有意义,但拆包它不会。

以下是我为编写测试而编写的ruby代码:

assets = {"0"=>{"id"=>"1", "add_asset"=>"0"},
          "1"=>{"id"=>"2", "add_asset"=>"0"},
          "2"=>{"id"=>"3", "add_asset"=>"1"}}

puts "assets= " + assets.to_s
puts "size = " + assets.length.to_s
assets.each_with_index do |check, i|
  puts "--i = " + i.to_s
  this = check[i]
  puts "this = " + this.to_s
  puts "id = " + this["id"].to_s
  puts "add = " + this["add_asset"].to_s
end

以下是我得到的结果:

d:\ Users \ Michael \ Documents> ruby​​ test.rb

assets= {"0"=>{"id"=>"1", "add_asset"=>"0"}, "1"=>{"id"=>"2", "add_asset"=>"0"}, "2"=>{"id"=>"3", "add_asset"=>"1"}}
size = 3
--i = 0
this = 0
id =
add =
--i = 1
this = {"id"=>"2", "add_asset"=>"0"}
id = 2
add = 0
--i = 2
this =
test.rb:14:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)
    from test.rb:10:in `each'
    from test.rb:10:in `each_with_index'
    from test.rb:10:in `<main>'

问题:

  1. 为什么无法读取记录“0”然后成功读取记录“1”?
  2. 为什么在纪录“2”上完全轰炸?

2 个答案:

答案 0 :(得分:3)

请勿使用each_with_index。您正在迭代哈希,而不是数组。要迭代哈希的键和值,请使用hash.each |key,value|

each_with_index将您的哈希值转换为数组,格式为[ [key1, value1], [key2, value2], ...]。这会给你一些看起来像这样的东西:

[
  ["0", {"id"=>"1", "add_asset"=>"0"}],
  ["1", {"id"=>"2", "add_asset"=>"0"}],
  ["2", {"id"=>"3", "add_asset"=>"1"}]
]

所以:

  

为什么无法读取记录“0”然后成功读取记录“1”?

不是。它失败了三次,只是一次失败看起来是正确的。

第一次迭代,i为0而check等于["0", {"id"=>"1", "add_asset"=>"0"}],您的块访问check[0] "0"。然后,检查"0"["id"]"0"["add_asset"],它们都是nil

在下一次迭代中,i1check["1", {"id"=>"2", "add_asset"=>"0"}]。该块访问check[1]并纯粹巧合地获取{"id"=>"2", "add_asset"=>"0"},事情似乎有效。

  

为什么在纪录“2”上完全轰炸?

在第三次迭代中,该块获得i 2check ["2", {"id"=>"3", "add_asset"=>"1"}]。该数组没有[2],因此您获得nil,然后您的数据块会尝试访问失败的nil["add"]

答案 1 :(得分:1)

在Ruby中,散列和数组之间存在差异。哈希几乎可以作为一把钥匙。数组只接受整数。你的哈希是用键的字符串构建的。像这样分解:

assets = {"0"=>{"id"=>"1", "add_asset"=>"0"},
          "1"=>{"id"=>"2", "add_asset"=>"0"},
          "2"=>{"id"=>"3", "add_asset"=>"1"}}

assets.each do |key, val|
  puts "key = #{key}"
  val.each do |inner_key, inner_val|
    puts "  key=#{inner_key} val=#{inner_val}"
  end
end

输出:

key = 0
  key=id val=1
  key=add_asset val=0
key = 1
  key=id val=2
  key=add_asset val=0
key = 2
  key=id val=3
  key=add_asset val=1