التابع Enumerable.slice_when
في روبي
يقطِّع التابع slice_when
عناصر الكائن القابل للتعداد إلى أجزاء تحدَّد بدايتها عبر كتلةٍ معطاةٍ ثم يعيد مُعدِّد لكل جزء من الأجزاء الناتجة.
البنية العامة
slice_when {|elt_before, elt_after| bool } → an_enumerator
يُقطِّع هذا التابع كل جزء باستعمال مفهوم العناصر المتجاورة - elt_before
و elt_after
- في المُعدِّد المستقبل. أي تُقطِّع هذه الدالة الأجزاء الواقعة بين elt_before
و elt_after
حيث تعيد الكتلة القيمة true
.
تُستدعَى الكتلة بعدد يساوي إلى طول المُعدِّد المستقبل مطروحًا من الواحد.
يُنتِج المُعدِّد المعاد العناصر المُجزَّأة كمصفوفة. لذلك، يمكن استدعاء التابع each
بالشكل التالي:
enum.slice_when { |elt_before, elt_after| bool }.each { |ary| ... }
يمكن أيضًا استعمال توابع الصنف Enumerator
والوحدة Enumerable
مثل التابع map
وغيره.
المعاملات
pattern
النمط المراد مطابقته للعناصر لتحديد نهايات الأجزاء المراد تقطيع عناصر الكائن المعطى إليها.
القيمة المعادة
يعاد مُعدِّد لكل جزء من الأجزاء المُقطَّعة.
أمثلة
مثال على تجميع الأعداد المتزايدة بمقدار واحد في قطع منفصلة باستعمال التابع slice_when
:
a = [1,2,4,9,10,11,12,15,16,19,20,21]
b = a.slice_when {|i, j| i+1 != j }
p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
c = b.map {|a| a.length < 3 ? a : "#{a.first}-#{a.last}" }
p c #=> [[1, 2], [4], "9-12", [15, 16], "19-21"]
d = c.join(",")
p d #=> "1,2,4,9-12,15,16,19-21"
العناصر المتقاربة في القيمة (بمقدار لا يتجاوز 6) في مصفوفة مرتبة يمكن تقطيعها إلى أجزاء بالشكل التالي:
a = [3, 11, 14, 25, 28, 29, 29, 41, 55, 57]
p a.slice_when {|i, j| 6 < j - i }.to_a
#=> [[3], [11, 14], [25, 28, 29, 29], [41], [55, 57]]
يمكن تقطيع سلاسل فرعية متزايدة (وليست متناقصة) إلى أجزاء بالشكل التالي:
a = [0, 9, 2, 2, 3, 2, 7, 5, 9, 5]
p a.slice_when {|i, j| i > j }.to_a
#=> [[0, 9], [2, 2, 3], [2, 7], [5, 9], [5]]
يمكن أيضًا تقطيع الأعداد الزوجية والفردية المتجاورة على النحو التالي (يمكن استعمال التابع chunk
لأداء الوظيفة نفسها):
a = [7, 5, 9, 2, 0, 7, 9, 4, 2, 0]
p a.slice_when {|i, j| i.even? != j.even? }.to_a
#=> [[7, 5, 9], [2, 0], [7, 9], [4, 2, 0]]
يمكن تقطيع الفقرات (الأسطر غير الفارغة مع أسطر فارغة زائدة) إلى أجزاء بالشكل التالي:
lines = ["foo\n", "bar\n", "\n", "baz\n", "qux\n"]
p lines.slice_when {|l1, l2| /\A\s*\z/ =~ l1 && /\S/ =~ l2 }.to_a
#=> [["foo\n", "bar\n", "\n"], ["baz\n", "qux\n"]]
يمكن فعل الشيء نفسه باستعمال التابع chunk_while
باستثناء التقطيع (الفصل) عندما تعيد الكتلة القيمة false
عوضًا عن القيمة true
.
انظر أيضًا
- التابع
drop_while
: يحذف العناصر الأولى المحقِّقة لشرط معيِّن من المُعدِّد المعطى ثم يعيد مصفوفة تحوي العناصر المتبقية. - التابع
chunk_while
: ينشئ مُعدِّدًا لكل جزء من العناصر المجمَّعة سويةً. تُعرَّف بداية الأجزاء (chunks) عبر الكتلة المعطاة.
- التابع
slice_before
: يقطِّع عناصر الكائن القابل للتعداد إلى أجزاء تحدَّد بدايتها عبر نمطٍ محدِّدٍ أو كتلةٍ معطاةٍ ثم يعيد مُعدِّد لكل جزء من الأجزاء الناتجة. - التابع
slice_after
: يقطِّع عناصر الكائن القابل للتعداد إلى أجزاء تحدَّد نهايتها عبر نمطٍ محدِّدٍ أو كتلةٍ معطاةٍ ثم يعيد مُعدِّد لكل جزء من الأجزاء الناتجة.