帮助ruby代码

时间:2011-09-07 07:52:09

标签: ruby jekyll

我是Ruby的初学者,无法理解这段代码

    require_relative 'custom_page'

module Jekyll   
  class Tag < CustomPage
    def initialize(site, base, dir, tag)
      super site, base, dir, 'tag'

      self.data['tag'] = tag
      self.data['title'] = "#{site.config['tag_title_prefix'] || 'Tag: '}#{tag}"
      self.data['description'] = "#{site.config['tag_meta_description_prefix'] || 'Tag: '}#{tag}"
    end
  end

  class Tags < CustomPage
    def initialize(site, base, dir)
      super site, base, dir, 'tags'
      self.data['tags'] = site.categories.keys.sort
      #1# puts self.data['tags']
    end
  end

  class Site
    # generate_tags_categories is called by the custom process function in site_process.rb

    def generate_tags_categories            
      dir = self.config['tag_dir'] || 'tags'
      write_page Tags.new(self, self.source, dir) if self.layouts.key? 'tags'        

      self.categories.keys.each do |tag|
      puts "dd"
      #2# puts tag    
      write_page Tag.new(self, self.source, File.join(dir, tag.slugize), tag)
      end
    end
  end
end

在上面的代码中,语句puts self.data['tags'](标记为1)按预期输出10个以上的值。但是,行puts tag(标记为2)仅输出一个值,表示该数组只包含一个值。预期self.categories.keys.each不会循环遍历分配给self.data['tags']

的所有值

1 个答案:

答案 0 :(得分:2)

您可以在进入循环之前确保'categories'仍然包含许多值:

puts "categories.keys: #{self.categories.keys.inspect}" # <<- here
self.categories.keys.each do |tag|
  puts "dd"
  #2# puts tag

如果第一个puts显示多个值,并且循环只调用一次,那么您可能想要研究可能导致循环中断的原因。也许write_page抛出一个异常,赶上调用堆栈的某个地方?

调试某些值时,最好使用inspect方法而不是(puts}方法to_s自动调用。 inspect的输出更适合调试。

有可能(但不太可能)'标签'包含一些清除先前输出的控制字符,或类似的东西。 inspect始终是安全的。 (好吧,并非总是如此,但在大多数情况下;)