Gleam 中的Nil是一種只有單一值的型別,這個值本身也叫做Nil。它和其他語言中的void類似,都是在函式沒有更合適的值可以回傳時使用。
io.println("Hello, Joe!")
// -> Nil
Gleam 中的值不像某些其他語言那樣有「nil-able」或「nullable」的概念。只有型別為Nil的值才可能是Nil,而其他任何型別的值永遠不可能是Nil。
和大多數程式語言一樣,Gleam 也有「副作用」,所以函式除了回傳值,還能讀取並改變世界的狀態。
Gleam 標準函式庫中的gleam/io模組提供了將字串輸出到主控台的函式。
io.println("Hello, Joe!")
// Hello, Joe!
// -> Nil
其他套件也可能提供其他 IO 函式,例如simplifile這個套件就提供了讀取和寫入檔案的函式。
simplifile.read("favourite-colour.txt")
// -> Ok("Pink\n")
Boris 是個超級鐵道模型迷,決定要發行電子報,和全世界分享他的熱情。他會先寄出電子報的第一期給同樣熱愛這項嗜好的朋友和熟人,這些人的電子郵件地址存放在一個文字檔裡。
提示:檔案相關操作請使用 simplifile 模組。
實作read_emails函式。它接受一個文字檔的路徑字串,該檔案包含以換行分隔的電子郵件地址,並回傳檔案中所有電子郵件地址的陣列。
read_emails("/home/my_user/documents/model_train_friends_emails.txt")
// -> Ok(["rick@example.com", "choochoo42@example.com", "anna@example.com"])
寄送電子郵件這件事,可能因為許多難以預期的原因而失敗,例如電子郵件地址打錯字,或是暫時的網路問題。為了確保你能重試寄信給所有朋友,又不會重複寄送,你需要記錄已經收到電子郵件的地址。為此,你會需要一個日誌檔。
實作create_log_file函式。它接受一個檔案路徑,並在該位置建立一個新的空檔案。
create_log_file("/home/my_user/documents/newsletter_issue1_log.txt")
// -> Ok(Nil)
實作log_sent_email函式。它接受日誌檔的路徑,以及一個包含電子郵件地址的字串。它會把該電子郵件地址寫入檔案,並在後面加上一個換行。
log_sent_email(
"/home/my_user/documents/newsletter_issue1_log.txt",
"joe@example.com",
)
// -> Ok(Nil)
現在你已經有了寄信流程的所有積木,接下來需要把它們組合成單一個函式。
實作send_newsletter函式。它接受電子郵件地址檔案的路徑、日誌檔的路徑,以及一個會寄送電子郵件到指定地址的匿名函式。
它應該從給定的檔案讀取所有電子郵件地址,並嘗試寄送電子郵件給每一個地址。如果負責寄信的匿名函式回傳Ok值,就把該電子郵件地址寫入日誌檔。務必在寄出電子郵件後立刻這麼做。
send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
send_email,
)
// -> Ok(Nil)