2009-11-25 6 views
0

Cela peut être vraiment évident mais je ne peux pas trouver la réponse.Comment obtenir l'index d'entier de l'ordre nommé

Comment obtenez-vous l'index entier de l'ordre nommé, comme:

{ :first => 0, :second => 1, :third => 2, :fourth => 3 } 

Y at-il quelque chose de construit pour Ruby Rails ou qui fait cela?

Merci.

Mise à jour

Merci pour toutes vos réponses. Voici la solution que je suis allé avec:

def index_for(position) 
    (0..4).to_a.send(position) 
end 

mais les tableaux prennent en charge que cinquième, donc il sera limité à cela.

Répondre

0

Je conserve généralement un tableau de clés de hachage pour maintenir l'ordre.

0

Quelle version de Ruby utilisez-vous? Pour Ruby 1.8, vous ne pouvez pas parce que dans cette version un hachage est une colletion non ordonnée. Cela signifie que lorsque vous insérez des clés, l'ordre n'est pas conservé. Lorsque vous parcourez le hachage, les clés peuvent être retournées dans un ordre différent de l'ordre dans lequel elles ont été insérées.

Il a cependant changé dans Ruby 1.9.

+1

Si cela est vrai pour Ruby 1.8, il a changé de Ruby 1.9. Hash préserve l'ordre d'insertion dans Ruby 1.9. Désolé pour nitpicking :) – mtyaka

+0

Non, merci pour l'information utile! Je vais mettre à jour le post pour être correct. –

0

Regardez dans Hash qui mélange Enumerable.
Je pense each_with_index est ce que vous recherchez:

# Calls block with two arguments, the item and its index, for each item in enum. 

hash = Hash.new 
%w(cat dog wombat).each_with_index {|item, index| 
    hash[item] = index 
} 
hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1} 
1

Si vous avez besoin de l'indice de commande, vous pourriez avoir besoin de combiner le tableau et a

keys = [ :first, :second, :third, :fourth ] 
hash = { :first => 0, :second => 1, :third => 2, :fourth => 3 } 
hash.each_key { |x| puts "#{keys.index(x)}" } 

La méthode ci-dessus ne fonctionne que dans 1.9 cependant.