1

私は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 とマーク) は 1 つの値のみを出力し、配列に値が 1 つしか含まれていないことを意味します。self.categories.keys.eachそれ自体が割り当てられているすべての値をループすることは期待されていませんself.data['tags']

4

1 に答える 1

2

ループに入る前に、「カテゴリ」にまだ多くの値が含まれていることを確認することから始めることができます。

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

最初putsに複数の値が表示され、ループが1回だけ呼び出される場合は、ループが中断する可能性のある原因を調査することをお勧めします。たぶんwrite_page例外をスローし、呼び出しスタックのどこかに追いつきますか?

一部の値をデバッグするときはinspect、(自動的に呼び出されるputs)メソッドの代わりにメソッドを使用することをお勧めしますto_s。の出力inspectは、よりデバッグしやすいです。

'tag'に、前の出力をクリアするいくつかの制御文字などが含まれている可能性があります(ただし、可能性は低いですが)。はinspect常に安全です。(わかりました、常にではありませんが、ほとんどの場合;)

于 2011-09-07T08:44:34.963 に答える