إنشاء LazyList
أنشئ متتاليات كسولة
إنشاء LazyList درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
أساسيات الإنشاء
توجد عدة طرق لبناء LazyList. أبسطها هي مُنشئ apply، تمامًا كما هو الحال عند بناء List.
لكن القوة الحقيقية تأتي من المُنشئات التي تُبقي الذيل كسولًا، وهذا ما سنستكشفه في هذا الدرس.
val ll = LazyList(10, 20, 30)
println(ll.head)LazyList الفارغة
LazyList.empty هي النهاية، والنظير الكسول لـ Nil. تنتهي بها كل LazyList منتهية.
تستخدمها كحالة أساس عند إضافة العناصر في البداية باستخدام #::.
object Demo extends App {
val empty = LazyList.empty[Int]
println(empty.isEmpty)
println(empty.toList)
}الإضافة في البداية باستخدام #::
يضيف المعامل #:: رأسًا إلى ذيل من نوع by-name. ابنِ القائمة من اليمين إلى اليسار، وأنهِها باستخدام LazyList.empty.
وبما أن #:: يأخذ ذيله بطريقة كسولة، فلا يُبنى شيء بعد الرأس حتى يُفرض تقييمه.
object Demo extends App {
val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.toList)
}مراقبة الكسولة
ضع مؤثرًا جانبيًا في الذيل لترى وقت تنفيذه. ولا يؤدي إلى تشغيله إلا فرض تقييم الذيل.
شغّل هذا المثال: تُطبع "building tail" فقط بعد الوصول إلى العنصر الثاني، وليس عند تعريف LazyList.
object Demo extends App {
val ll = 1 #:: { println("building tail"); 2 #:: LazyList.empty }
println("defined")
println(ll.head)
println(ll(1))
}استخدام cons صراحةً
تحت الغطاء، يمثل #:: الدالة LazyList.cons. ويكون كل من الرأس والذيل من نوع by-name في cons، مما يمنحك تحكمًا كاملًا في التقييم.
يفيد ذلك عند تعريف المولّدات العودية.
val ll = LazyList.cons(1, LazyList.cons(2, LazyList.empty))
println(ll.head)المولّدات العودية
يمكن لـ LazyList أن تشير إلى نفسها. عرّف دالة تنتج رأسًا وتستدعي نفسها عوديًا لإنتاج الذيل.
وبما أن الذيل من نوع by-name، فلا تستمر العودية إلى ما لا نهاية؛ بل تتوقف مؤقتًا حتى تُطلب كل خلية.
def countFrom(n: Int): LazyList[Int] =
n #:: countFrom(n + 1)
println(countFrom(5).take(3).toList)تشغيل مولّد
لنشغّل مولّدًا يشير إلى نفسه ونسحب منه بضع قيم. يحدّد take عدد الخلايا التي سيُفرض تقييمها.
من دون take ستستمر العملية إلى ما لا نهاية، لذا احرص دائمًا على تقييد المولّد اللانهائي قبل فرض تقييمه.
object Demo extends App {
def countFrom(n: Int): LazyList[Int] =
n #:: countFrom(n + 1)
println(countFrom(1).take(5).toList)
}من Iterator
يمكنك تغليف مجموعة أو مكرّر موجود. ينشئ LazyList.from(start) تسلسلًا لانهائيًا متزايدًا، بينما يحوّل someList.to(LazyList) البيانات المعروفة مسبقًا بطريقة eager.
يوفّر هذان الأسلوبان عرضًا كسولًا للبيانات التي لديك أو التي يمكنك وصفها.
object Demo extends App {
val ll = List(1, 2, 3).to(LazyList)
println(ll.map(_ * 2).toList)
}LazyList.iterate
يطبّق LazyList.iterate(seed)(f) الدالة f مرارًا لبناء كل عنصر تالٍ انطلاقًا من العنصر السابق.
إنها طريقة واضحة للتعبير عن التسلسلات المحددة بقاعدة انتقال، مثل قوى العدد اثنين.
object Demo extends App {
val powers = LazyList.iterate(1)(_ * 2)
println(powers.take(6).toList)
}LazyList.continually
يكرّر LazyList.continually(expr) تعبيرًا بلا نهاية، مع إعادة تقييمه لكل عنصر. ويفيد ذلك في التدفقات الثابتة أو العشوائية.
استخدمه مع take للحصول على جزء محدود.
object Demo extends App {
val zeros = LazyList.continually(0)
println(zeros.take(4).toList)
}اختيار المُنشئ
استخدم apply للقوائم الصغيرة الثابتة، و#:: أو cons للعودية المكتوبة يدويًا، وiterate لقواعد الانتقال، وfrom للعدّ، وcontinually للتكرار.
تحافظ جميعها على كسولة الذيل، لذا يعتمد الاختيار على سهولة التعبير.
اختبار سريع
تحقّق من فهمك لإنشاء LazyList.
مراجعة
بنيت LazyLists باستخدام apply وempty و#::/cons وiterate وfrom وcontinually.
يجعل الذيل من نوع by-name تعريف المولّدات التي تشير إلى نفسها، والتي قد تكون لا نهائية، آمنًا. بعد ذلك سنستفيد من ذلك لإنشاء تدفقات لا نهائية فعلًا.
الأسئلة الشائعة
هل درس «إنشاء LazyList» مجاني؟
نعم — نص درس «إنشاء LazyList» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء LazyList»؟
أنشئ متتاليات كسولة تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إنشاء LazyList»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- شرح الكسلية
- إنشاء LazyList
- التدفقات اللانهائية
- الأخذ والتصفية بكسل