如何伪造哈希索引?

时间:2009-11-13 20:04:17

标签: ruby

程序我正在制作一个简单的配置文件,看起来像这样。

@overlays = {
  :foo => "http://www.bar.com",
  :bar => nil,
}

我需要做的是通过这个哈希并得到以下输出。

OverlayKey[0]='foo'
OverlayVal[0]='http://www.bar.com'
OverlayKey[1]='bar'
OverlayVal[1]='nil'

为了保持我想要的配置,我需要一些假索引号。宁愿不在哈希中添加数字,这会使配置看起来有点难看。所以我一直在玩,在输出过程中人工生成数字。

这很难看,但我现在只是玩弄它。

def makenumbers
  @numbers = [] 
  length = @overlays.length - 1
  (0..length).each do |num|
    @numbers.push("#{num}")
  end
end

makenumbers

@overlays.each do |key,val|
  @numbers.each do |num|
    puts "OverlayKey['#{num}']='#{key}'"
    puts "OverlayVal['#{num}']='#{val}'"
  end
end

这给了我这样的东西。

OverlayKey['0']='foo'
OverlayVal['0']='http://www.bar.com'
OverlayKey['1']='foo'
OverlayVal['1']='http://www.bar.com'
OverlayKey['0']='bar'
OverlayVal['0']=''
OverlayKey['1']='bar'
OverlayVal['1']=''

明白为什么这不能给我输出我想要的输出,虽然在玩了一点后我不确定如何做我想要的而不在配置期间在哈希中添加数字。当然这很简单,我似乎无法绕过它。

1 个答案:

答案 0 :(得分:4)

我不知道除了Hashes默认情况下未解决的问题是什么:

overlays = {
  :foo => "http://www.bar.com",
  :bar => nil,
}

overlays.each_with_index do |(k,v), i|
  puts "OverlayKey['#{i}']=#{k.to_s.inspect}"
  puts "OverlayVal['#{i}']=#{v.to_s.inspect}"
end

输出如下:

OverlayKey['0']="bar"
OverlayVal['0']=""
OverlayKey['1']="foo"
OverlayVal['1']="http://www.bar.com"

作为说明:

# Instead of this:
"#{num}"
# Use this:
num.to_s