Gleam 中的 Nil 是一种类型,它只有一个值,这个值也叫 Nil。它类似于其他语言中的 void,用在函数没有更合适的值可以返回的时候。
io.println("Hello, Joe!")
// -> Nil
Gleam 中的值不像其他一些语言那样可以是“空值”或“可空的”。只有当值的类型是 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)