Ruby块似乎无法访问本地范围变量

时间:2011-06-25 08:58:25

标签: ruby-on-rails ruby scope block

我正在编写一个函数,该函数读入答案键,创建一个问题,然后将正确的答案与这些问题相关联。这是我的功能:

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 个答案:

答案 0 :(得分:3)

错误必须在其他地方,这段代码应该有用。

写一些单元测试并重构这个方法,它试图做太多事情。

此外,当您循环覆盖图像时,您可以摆脱counter并使用each_with_index代替。