همهی توابع موجود در ماژول Enum حریصانه هستند. وقتی چندین عملیات را با ماژول Enum روی دادههای قابل شمارش انجام میدهید، هر عملیات یک نتیجهی میانی تولید میکند.
ماژول Stream جایگزینی تنبل برای ماژول Enum است که حریصانه عمل میکند. این ماژول بسیاری از همان توابع Enum را ارائه میدهد، اما بهجای تولید نتایج میانی، مجموعهای از محاسبات را میسازد که تنها زمانی اجرا میشوند که جریان به یکی از توابع ماژول Enum سپرده شود.
جریانها پروتکل Enumerable را پیادهسازی میکنند و قابلیت ترکیب دارند. میتوانید آنها را به هم زنجیر کنید تا کارکردی پیچیدهتر بسازید.
شما طرفدار پروپاقرص کانال یوتیوب Numberphile هستید و تازه ویدیوی جالبی دربارهی دنبالهی اعداد لوکاس دیدهاید. میخواهید این دنباله را با Elixir بسازید.
هنگام طراحی تابع خود، میخواهید از ارزیابی تنبل استفاده کنید تا بتوانید هر تعداد عدد که میخواهید تولید کنید، اما فقط اگر به آنها نیاز داشته باشید. پس تصمیم میگیرید از یک استریم استفاده کنید.
یک guard clause اضافه کنید تا اگر برای تولید دنباله مقداری به کار رود که عدد صحیح نباشد یا عدد صحیحی کوچکتر از ۱ باشد، خطا ایجاد شود. انجام این کار در گام اول، از بروز bugهای بازگشت بینهایت در گامهای بعدی جلوگیری میکند.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
میدانید که این دنباله دو عدد آغازین دارد که از قاعدهی یکسانی پیروی نمیکنند. دو بند حالت پایه بنویسید تا این اعداد را برگردانند:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
برای هر دنبالهای بلندتر از ۲، میدانید که باید دو عدد قبلی را جمع کنید تا عدد بعدی به دست بیاید و به همین ترتیب ادامه دهید. حالت تعمیمیافته را بنویسید.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]