التابع 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
: يحذف أول عدة عناصر من المُعدِّد الذي استدعي معه ثم يعيد بقية العناصر في مصفوفة.