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

من موسوعة حسوب
مراجعة 18:01، 30 ديسمبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يقطِّع التابع 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: يقطِّع عناصر الكائن القابل للتعداد إلى أجزاء تحدَّد نهايتها عبر نمطٍ محدِّدٍ أو كتلةٍ معطاةٍ ثم يعيد مُعدِّد لكل جزء من الأجزاء الناتجة.

مصادر