循环遍历数组的索引

时间:2012-04-15 19:50:09

标签: ruby

我正在开发一个Ruby脚本,它将从Gmail下载电子邮件并下载与特定模式匹配的附件。我基于Ruby的优秀Mail gem。我使用的是Ruby 1.9.2。我不是那种经验丰富的Ruby,并感谢任何提供的帮助。

在下面的代码中,电子邮件是从gmail返回的包含特定标签的电子邮件数组。我所坚持的是循环遍历电子邮件数组并处理每封电子邮件上的多个附件。如果我指定索引值,电子邮件[index] .attachments.each的内部循环确实有效,我没有成功地包装第一个循环来遍历数组的所有索引值。

emails = Mail.find(:order => :asc, :mailbox => 'label')

emails.each_with_index do |index|
    emails[index].attachments.each do | attachment |
      # Attachments is an AttachmentsList object containing a
      # number of Part objects
      if (attachment.filename.start_with?('attachment'))
        filename = attachment.filename
        begin
            File.open(file_dir + filename, "w+b", 0644) {|f| f.write attachment.body.decoded}
        rescue Exception => e
            puts "Unable to save data for #{filename} because #{e.message}"
        end
      end
    end
end

2 个答案:

答案 0 :(得分:10)

each_with_index的语法是这样的:

@something.each_with_index do |thing,index|
    puts index, thing
end

然后你应该替换这条线     emails.each_with_index do | index |

emails.each_with_index do |email,index|

但是我没有看到你实际使用索引,所以你可以通过probalby简化它:

emails.each do |email|
    email.attachments.each do | attachment |
....

答案 1 :(得分:3)

each_with_index产生的第一个参数是对象,而不是索引。

emails.each_with_index do |o, i|
  o.attachments.each do | attachment |

除非您需要我们未见过的代码索引,否则您可以在那里使用each方法。