2015-10-29 2 views
1

J'essaie de parcourir le fichier de base de données avec gdbm, créer des objets avec les valeurs que je reçois et les affecter à un tableau. Le problème est que je n'arrive pas à obtenir l'indice d'itération et j'en ai besoin pour mon tableau. Voici le code:Obtenir l'index de l'itération de base de données sur ruby ​​

bots_directory = "../data/bots.db" 

bots = Array.new 

GDBM.new(bots_directory).each_pair.with_index do |nickname, password, index| 
    bots[index] = Bot.new(nickname, password) 
end 

erreur que je reçois:

`[]=': no implicit conversion from nil to integer (TypeError) 

Aussi, fermera ses portes de fichiers de base de données après que le bloc est exécuté?

+0

Il s'agit d'une simple mauvaise compréhension de la façon dont les arguments sont transmis au bloc et du fonctionnement de l'affectation parallèle. votre code donnera '[[clé, valeur], index]' cela signifie que le pseudo est maintenant '[clé, valeur]', le mot de passe est 'index', et l'index est nul. Pour diviser la valeur de la clé, vous devez envelopper le pseudo et le mot de passe entre parenthèses pour les diviser, puis devient pseudo, mot de passe = [clé, valeur] 'et index = index.Mais @spickermann a suggéré de bien meilleurs moyens pour accomplir ceci comme la carte. Pour une compréhension rapide, essayez ceci dans irb 'a, b, c = [[" k "," v "], 1]' puis essayez '(a, b), c = [[" k "," v "] , 1] ' – engineersmnky

Répondre

2

J'utilise each_with_index au lieu de each_pair.with_index:

bots_directory = "../data/bots.db" 
bots = [] 

GDBM.new(bots_directory).each_with_index do |(nickname, password), index| 
    bots[index] = Bot.new(nickname, password) 
end 

Ou encore plus simple, puisque l'indice commence à partir 0 et augmente de toute façon 1:

bots_directory = "../data/bots.db" 
bots = [] 

GDBM.new(bots_directory).each_pair do |nickname, password| 
    bots << Bot.new(nickname, password) 
end 

Peut-être map est également une option?

bots_directory = "../data/bots.db" 

bots = GDBM.new(bots_directory).map do |nickname, password| 
    Bot.new(nickname, password) 
end 
+0

Merci, je vais utiliser' map' – PoVa

+1

Excellente réponse, bien qu'expliquant pourquoi cela ne fonctionne pas (arguments donnés et affectation parallèle) serait probablement un ajout bénéfique. – engineersmnky