我是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']
答案 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
始终是安全的。 (好吧,并非总是如此,但在大多数情况下;)