解压缩由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>'
问题:
答案 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
。
在下一次迭代中,i
为1
,check
为["1", {"id"=>"2", "add_asset"=>"0"}]
。该块访问check[1]
并纯粹巧合地获取{"id"=>"2", "add_asset"=>"0"}
,事情似乎有效。
为什么在纪录“2”上完全轰炸?
在第三次迭代中,该块获得i
2
和check
["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