如何传递散列范围以从索引1到最后一次迭代?
h = {}
h[1..-1].each_pair do |key,value|
puts "#{key} = #{value}
end
此代码返回错误。我怎么可以在哈希中传递范围?
编辑:
我想打印第一个键和值而不进行任何计算。
从第二个键和值我想对哈希值进行一些计算。
为此,我写了这段代码...... store_content_in_hash包含键和值。
first_key_value = store_content_in_hash.shift
f.puts first_key_value[1]
f.puts
store_content_in_hash.each_pair do |key,value|
store_content_in_hash[key].sort.each {|v| f.puts v }
f.puts
end
有什么更好的方法可以解决这个问题吗?
答案 0 :(得分:8)
仅限Ruby 1.9:
给出哈希:
h = { :a => :b, :c => :d, :e => :f }
Go like this:
Hash[Array(h)[1..-1]].each_pair do |key, value|
# ...
end
这会迭代以下哈希{ :c => :d, :e => f }
,因为第一个键/值对被范围排除。
答案 1 :(得分:2)
哈希没有秩序的概念。哈希中没有第一个或第二个元素。
所以你不能用哈希来做你想做的事。
答案 2 :(得分:0)
哈希与范围无关。这是关键值对。在ruby 1.8中,散列是无序的,因此你无法确定键和值将以哪种顺序迭代,使“范围”的东西过时。而且我相信你在这种情况下做错了什么。你能详细说明你的问题吗?
另一方面,您收到错误,因为Hash实例中的方括号接受键。因此,如果您的哈希值不包含1..-1
作为键 - 您将获得nil值,而nil不会响应each_pair
。试试这个来抓住这个:
h = {(1..-1) => {:foo => :bar}}
h[1..-1].each_pair do |key,value|
puts "#{key} = #{value}"
end
答案 3 :(得分:0)
正如其他人所指出的,哈希不是关于秩序的。确实,1.9哈希是有序的,但这只是一个方便,而不是它们的主要特征。
如果订单对您很重要,只需使用数组而不是哈希值。在您的情况下,一对数组(双元素数组)似乎符合目的。如果您需要通过密钥访问它,您可以使用Hash#[]
方法轻松将其转换为哈希值。