سؤال

أنا مبتدئ في روبي وأواجه صعوبة في فهم هذا الكود

    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']

هل كانت مفيدة؟

المحلول

يمكنك البدء بالتأكد من أن "الفئات" ما زال تحتوي على العديد من القيم قبل الدخول إلى الحلقة:

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 آمن دائمًا. (حسنا، ليس دائما ولكن في معظم الحالات؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top