2009-11-13 3 views
0

Programme que je fais a un fichier de configuration simple ressemblant à quelque chose comme ça.Comment fausser un index de hachage?

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

Ce que je dois faire est de passer ce hachage et obtenir la sortie suivante. Pour conserver ma configuration comme je le veux, j'ai besoin de faux numéros d'index. Je préférerais ne pas ajouter de chiffres dans le hachage, cela rendrait la configuration un peu moche. J'ai donc joué avec la génération artificielle des nombres pendant la production.

C'est laid, mais je "m juste à jouer avec elle actuellement.

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 

Ce qui me donne quelque chose comme ça.

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']='' 

comprendre pourquoi cela ne me donne pas la sortie Je veux, bien que je ne sois pas vraiment sûr de faire ce que je veux sans avoir à ajouter de chiffres dans le hachage pendant la configuration, bien que je ne sois pas vraiment capable de le contourner.

Répondre

4

Je ne sais pas ce que le problème est autre que Hashes par défaut ne sont pas triés:

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 

sortie ressemble à ceci:

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

Comme une note:

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

Autre que moi étant l'idiot qui a lu l'API de hash 3 fois aujourd'hui et certains comment manqué with_index. Tout bien que je suppose que c'est un énumérable. Merci. – gregf

+1

Oui, c'est dans Enumerable, donc c'est facile à oublier. Il y a beaucoup de méthodes très utiles dans Enumerable qui s'appliquent à Array et Hash, donc ça vaut la peine d'en lire plus, car cela peut vous faire gagner du temps avec le bon appel contre un gros bidouillage. – tadman

+1

Upvote pour Enumerable - lisez l'API jusqu'à ce que vous connaissiez toutes les différentes constructions dont il dispose, que le (petit) temps passé sera rentable à long terme. –

Questions connexes