خبرنامه

خبرنامه

تمرین یادگیری

مقدمه

File

ماژول File توابع کار با فایل را فراهم می‌کند.

برای خواندن کل یک فایل، از File.read/1 استفاده کنید. برای نوشتن در یک فایل، از File.write/2 استفاده کنید.

هر بار که با File.write/2 در فایلی نوشته می‌شود، یک توصیفگر فایل باز می‌شود و یک فرایند جدید الیکسر ایجاد می‌شود. به همین دلیل، نباید در یک حلقه با File.write/2 در فایل بنویسید.

در عوض، می‌توانید فایل را با File.open/2 باز کنید. آرگومان دوم File.open/2 فهرستی از حالت‌ها است که به شما اجازه می‌دهد مشخص کنید فایل را برای خواندن باز می‌کنید یا برای نوشتن.

File.open/2 یک PID برمی‌گرداند؛ یعنی شناسه‌ی فرایندی که فایل را مدیریت می‌کند. برای خواندن و نوشتن در فایل، از توابع ماژول IO استفاده کنید و این PID را به عنوان دستگاه IO به آن‌ها بدهید.

وقتی کارتان با فایل تمام شد، آن را با File.close/1 ببندید.

همه‌ی توابع یادشده از ماژول File نسخه‌ای با ! هم دارند که به جای برگرداندن تاپل خطا، خطا ایجاد می‌کند (مثلاً File.read!/1). اگر قصد ندارید به خطاهایی مانند نبودن فایل یا نداشتن مجوز رسیدگی کنید، از آن نسخه استفاده کنید.

دستورالعمل‌ها

شما علاقه‌ی زیادی به قطارهای مدل دارید و تصمیم گرفته‌اید اشتیاق خود را با جهان به اشتراک بگذارید و یک خبرنامه راه بیندازید. کار را با فرستادن اولین شماره‌ی خبرنامه برای دوستان و آشنایانی شروع می‌کنید که این سرگرمی را با شما مشترک دارند. یک فایل متنی دارید که فهرست نشانی‌های ایمیل آن‌ها در آن است.

1. خواندن نشانی‌های ایمیل از یک فایل

تابع Newsletter.read_emails/1 را پیاده‌سازی کنید. این تابع یک مسیر فایل می‌گیرد. فایل، یک فایل متنی است که نشانی‌های ایمیل را با خط جدید از هم جدا کرده است. تابع باید فهرستی از نشانی‌های ایمیل موجود در فایل را برگرداند.

Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]

2. باز کردن یک فایل گزارش برای نوشتن

فرستادن ایمیل کاری است که ممکن است به دلایل غیرقابل‌پیش‌بینی زیادی شکست بخورد، مثلاً یک غلط تایپی در نشانی ایمیل یا مشکل موقت شبکه. برای اینکه بتوانید فرستادن ایمیل‌ها به همه‌ی دوستانتان را دوباره امتحان کنید بدون آنکه ایمیل تکراری بفرستید، باید نشانی‌هایی را ثبت کنید که ایمیل را دریافت کرده‌اند. برای این کار به یک فایل گزارش نیاز دارید.

تابع Newsletter.open_log/1 را پیاده‌سازی کنید. این تابع یک مسیر فایل می‌گیرد، فایل را برای نوشتن باز می‌کند و PID فرایندی را که فایل را مدیریت می‌کند برمی‌گرداند.

Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>

3. ثبت یک ایمیل فرستاده‌شده

تابع Newsletter.log_sent_email/2 را پیاده‌سازی کنید. این تابع PID فرایندی که فایل را مدیریت می‌کند و یک رشته شامل نشانی ایمیل را می‌گیرد. باید نشانی ایمیل را در فایل بنویسد و پس از آن یک خط جدید بگذارد.

Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok

4. بستن فایل گزارش

تابع Newsletter.close_log/1 را پیاده‌سازی کنید. این تابع PID فرایندی که فایل را مدیریت می‌کند می‌گیرد و فایل را می‌بندد.

Newsletter.close_log(pid)
# => :ok

5. فرستادن خبرنامه

حالا که همه‌ی اجزای سازنده‌ی فرایند فرستادن ایمیل را دارید، باید آن‌ها را در یک تابع واحد با هم ترکیب کنید.

تابع Newsletter.send_newsletter/3 را پیاده‌سازی کنید. این تابع مسیر فایل نشانی‌های ایمیل، مسیر یک فایل گزارش و یک تابع بی‌نام را می‌گیرد که ایمیلی را به نشانی ایمیل داده‌شده می‌فرستد. باید همه‌ی نشانی‌های ایمیل را از فایل داده‌شده بخواند و بکوشد به هر یک از آن‌ها ایمیل بفرستد. اگر تابع بی‌نامی که ایمیل را می‌فرستد مقدار :ok را برگرداند، نشانی ایمیل را در فایل گزارش بنویسد و پس از آن یک خط جدید بگذارد. دقت کنید این کار را به‌محض فرستادن ایمیل انجام دهید. پس از پایان همه‌ی فرستادن‌ها، فایل گزارش را ببندید.

Newsletter.send_newsletter(
  "model_train_friends_emails.txt",
  "newsletter_issue1_log.txt",
  fn email -> :ok end
)

# => :ok
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید خبرنامه را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.