Блок Ruby не может получить доступ к локальным переменным области видимости
Я пишу функцию, которая читает ключ ответа, создает вопрос, а затем связывает правильный ответ с этими вопросами. Вот моя функция:
def self.save_images_in_dir(dir)
answer_key_file = Dir.glob(dir+"/*.{rtf,txt}").first
answer_key = Array.new
if answer_key_file
puts "found key"
File.open(answer_key_file, "r") do |infile|
while (line = infile.gets)
if line.match(/^\d+[.]\s+/)
num = line.match(/\d+/)
answer = line.gsub(/\d+[.]\s+/,"") # Take out the 1.
answer.chomp!
answer_key.push(answer.to_s)#answer_key[num.to_s]=answer.to_s
puts "number #{num} is #{answer.to_s}"
end
end
end
end
images = Dir.glob("#{dir}*.{png,jpeg,jpg,gif}").sort_by {|file| File.ctime(file) }
counter = 0
answer_key.each do |q|
puts "before entering: #{q}"
end
images.each do |img|
q = self.new
q.tags = get_tags(img)
q.correct_answer = answer_key[counter]
puts "---------Answer is:#{answer_key[counter]}--------\n"
q.photo = File.open(img)
if q.correct_answer.nil?
puts "answer is nil"
end
counter = counter + 1
end
end
и вот фрагмент вывода прямо перед тем, как он входит в блок images.each.
перед входом: D
перед входом: A
перед входом: A
перед входом: C
перед входом: A
найденный ключ
--------- Ответ: --------
ответ ноль
Кто-нибудь знает, почему answer_key будет "сбрасываться", и, кроме того, почему answer_key.count будет возвращать 0 при оценке в блоке изображений? Я понимаю, что блоки должны наследовать локальную область видимости, откуда они вызываются... какая-либо причина, почему answer_key не будет передан?
1 ответ
Ошибка должна быть где-то еще, этот код должен работать.
Напишите несколько юнит-тестов и проведите рефакторинг этого метода, он пытается сделать слишком много вещей.
Кроме того, когда вы перебираете изображения, вы можете избавиться от counter
и использовать each_with_index
вместо.