التابع Enumerable.chunk في روبي

من موسوعة حسوب

يُمرِّر التابع chunk كل عنصر من عناصر المجموعة التي استدعيت معه إلى الكتلة المعطاة ثمَّ يُقطِّعها إلى أجزاء (قطع صغيرة) بحسب القيمة المعادة من الكتلة. العناصر المتتالية التي يكون لها نفس القيمة المعادة من الكتلة هي التي تُجمَّع سويةً.

القيم المفتاحية التالية لها معنًى خاص:

  • nil و ‎:_separator: يحدِّدان بأنَّه يجب على العناصر أن تُحذَف. يمكن استعمالهما لتجاهل بعض العناصر.
  • :_alone: يحدِّد بأنه يجب على العنصر أن يُجمَّع لوحده.

أية رموز أخرى تبدأ بخط سفلي (underscore) سيؤدي استعمالها إلى رمي خطأ.

البنية العامة

chunk { |elt| ... }  an_enumerator

القيمة المعادة

تعاد الأجزاء المُقطَّعة لعناصر المجموعة المعطاة بعد تمريرها إلى الكتلة، أو يعاد كائن من النوع Enumerator إلى `chunk`إن لم تُعطَ الكتلة.

أمثلة

استعمال التابع chunk لتجميع الأعداد الزوجية والفردية المتتالية في قطع بالشكل التالي:

[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5].chunk { |n|
  n.even?
}.each { |even, ary|
  p [even, ary]
}
#=> [false, [3, 1]]
#   [true, [4]]
#   [false, [1, 5, 9]]
#   [true, [2, 6]]
#   [false, [5, 3, 5]]

إحدى فوائد استعمال التابع chunk هي تخزين سلسلة من العناصر. المثال التالي يَعدُّ الكلمات لكل حرف استهلالي (initial letter):

open("/usr/share/dict/words", "r:iso-8859-1") { |f|
  f.chunk { |line| line.ord }.each { |ch, lines| p [ch.chr, lines.length] }
}
#=> ["\n", 1]
#   ["A", 1327]
#   ["B", 1372]
#   ["C", 1507]
#   ["D", 791]
#   ...

مثال على استعمال التابع chunk مع رمز يبدأ بخط سفلي:

items.chunk { |item| :_underscore }
#=> RuntimeError: symbols beginning with an underscore are reserved

مثال آخر على استعمال التابع chunk مع إحدى القيم المفتاحية لحذف سلسلة من الخطوط الصغيرة (hyphens) في السجل svn:

sep = "-"*72 + "\n"
IO.popen("svn log README") { |f|
  f.chunk { |line|
    line != sep || nil
  }.each { |_, lines|
    pp lines
  }
}
#=> ["r20018 | knu | 2008-10-29 13:20:42 +0900 (Wed, 29 Oct 2008) | 2 lines\n",
#    "\n",
#    "* README, README.ja: Update the portability section.\n",
#    "\n"]
#   ["r16725 | knu | 2008-05-31 23:34:23 +0900 (Sat, 31 May 2008) | 2 lines\n",
#    "\n",
#    "* README, README.ja: Add a note about default C flags.\n",
#    "\n"]
#   ...

يمكن تحليل الفقرات المفصولة بأسطر فارغة بالشكل التالي:

File.foreach("README").chunk { |line|
  /\A\s*\z/ !~ line || nil
}.each { |_, lines|
  pp lines
}

يمكن استعمال الرمز ‎:_alone مع التابع chunk لإجبار العناصر على تشكيل الأجزاء الخاصة بها بحد ذاتها. على سبيل المثال، يمكنك وضع أسطر تحوي عنوان URL بحد ذاتها وتجميع بقية الأسطر سويةً بالشكل التالي:

pattern = /http/
open(filename) { |f|
  f.chunk { |line| line =~ pattern ? :_alone : true }.each { |key, lines|
    pp lines
  }
}

انظر أيضًا

  • التابع chunk_while: ينشئ مُعدِّدًا لكل جزء من العناصر المجمَّعة سويةً. تُعرَّف بداية الأجزاء (chunks) عبر الكتلة المعطاة.
  • التابع collect: يعيد مصفوفة جديدة تحوي نتائج تنفيذ الكتلة المعطاة دفعةً واحدةً مع كل عنصر من عناصر المُعدِّد الذي استدعي معه.
  • التابع drop: يحذف أول عدة عناصر من المُعدِّد الذي استدعي معه ثم يعيد بقية العناصر في مصفوفة.

مصادر