سؤال
أنا مبتدئ في روبي وأواجه صعوبة في فهم هذا الكود
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
آمن دائمًا. (حسنا، ليس دائما ولكن في معظم الحالات؛)