2015-10-29 2 views
1

Я пытаюсь выполнить итерацию через файл базы данных с помощью gdbm, создать объекты со значениями, которые я получаю, и назначить их массиву. Проблема в том, что я не могу получить индекс итерации, и мне это нужно для моего массива. Вот код:Получить индекс итерации базы данных на 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 

Я получаю ошибку:

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

Кроме того, будет файл базы данных закрывается после блока выполняется?

+0

Это простое непонимание того, как аргументы передаются блоку и как работает параллельное присвоение. ваш код будет выдавать '[[ключ, значение], index]' это означает, что псевдоним теперь '[key, value]', пароль - 'index', а index - nil. Чтобы разделить ключевое значение, вам нужно обернуть псевдоним и пароль в круглых скобках, чтобы они их разделили, а затем стали «никнейм», «пароль» = [ключ, значение] »и« индекс = индекс ». Но @spickermann предложил гораздо лучшие способы выполнить это таких как карта. Для быстрого понимания попробуйте это в irb 'a, b, c = [[" k "," v "], 1]', затем попробуйте '(a, b), c = [[" k "," v "] , 1] ' – engineersmnky

ответ

2

Я хотел бы использовать each_with_index вместо 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 

Или еще проще, так как индекс начинается с 0 и увеличивается 1 все равно:

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

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

Возможно map также вариант?

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

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

Спасибо, я буду использовать' map' – PoVa

+1

Отличный ответ, хотя объяснение, почему это не сработает (получились аргументы и параллельное назначение), вероятно, было бы полезным дополнением. – engineersmnky

Смежные вопросы