Блок Ruby не может получить доступ к локальным переменным области видимости - PullRequest
0 голосов
/ 25 июня 2011

Я пишу функцию, которая читает ключ ответа, создает вопрос, а затем связывает правильный ответ с этими вопросами.Вот моя функция:

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 Ответ

3 голосов
/ 25 июня 2011

Ошибка должна быть где-то еще, этот код должен работать.

Напишите несколько юнит-тестов и проведите рефакторинг этого метода, он пытается сделать слишком много вещей.

Кроме того, когда вы перебираете изображения, вы можете избавиться от counter и использовать вместо него each_with_index.

...