轨道
/
Gleam
Gleam
/
练习
/
新闻简报
新闻简报

新闻简报

学习练习

简介

Nil

Gleam 中的 Nil 是一种类型,它只有一个值,这个值也叫 Nil。它类似于其他语言中的 void,用在函数没有更合适的值可以返回的时候。

io.println("Hello, Joe!")
// -> Nil

Gleam 中的值不像其他一些语言那样可以是“空值”或“可空的”。只有当值的类型是 Nil 时,这个值才可能是 Nil,而其他任何类型的值都不可能是 Nil。

IO

和大多数编程语言一样,Gleam 也有“副作用”:函数除了返回一个值,还可以读取和改变外部世界的状态。

Gleam 标准库中的 gleam/io模块提供了一些函数,用于把字符串打印到控制台。

io.println("Hello, Joe!")
// Hello, Joe!
// -> Nil

其他包可能会提供别的 IO 函数,比如 simplifile,这个包提供了读取和写入文件的函数。

simplifile.read("favourite-colour.txt")
// -> Ok("Pink\n")

说明

Boris 是个狂热的火车模型爱好者,决定通过创办一份邮件通讯来与世界分享这份热情。他打算先把邮件通讯的第一期发送给有同样爱好的朋友和熟人,这些人的电子邮件地址存储在一个文本文件中。

提示:使用 simplifile 模块进行文件操作。

1. 从文件中读取电子邮件地址

实现read_emails函数。它接收一个指向文本文件的路径字符串,该文件包含以换行符分隔的电子邮件地址,并返回由文件中的电子邮件地址组成的数组。

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

2. 创建一个用于写入的日志文件

发送电子邮件这项任务可能会因为许多无法预料的原因而失败,比如电子邮件地址拼写错误,或者临时出现网络问题。为了确保你可以重新向所有朋友发送邮件而不会重复发送,你需要记录已经收到过邮件的电子邮件地址。为此,你需要一个日志文件。

实现create_log_file函数。它接收一个文件路径,并在该位置创建一个新的空文件。

create_log_file("/home/my_user/documents/newsletter_issue1_log.txt")
// -> Ok(Nil)

3. 记录已发送的电子邮件

实现log_sent_email函数。它接收日志文件的路径和一个包含电子邮件地址的字符串。它把电子邮件地址写入文件,并在后面加上一个换行符。

log_sent_email(
  "/home/my_user/documents/newsletter_issue1_log.txt",
  "joe@example.com",
)
// -> Ok(Nil)

4. 发送邮件通讯

现在你已经有了发送电子邮件流程的全部基本组成部分,需要把它们组合到一个函数中。

实现send_newsletter函数。它接收包含电子邮件地址的文件的路径、日志文件的路径,以及一个向给定电子邮件地址发送邮件的匿名函数。

它应该从给定文件中读取所有电子邮件地址,并尝试向其中每一个地址发送电子邮件。如果发送邮件的匿名函数返回Ok值,就把该电子邮件地址写入日志文件。确保邮件一发送就立刻执行这一步。

send_newsletter(
  "model_train_friends_emails.txt",
  "newsletter_issue1_log.txt",
  send_email,
)
// -> Ok(Nil)
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Gleam Exercism

准备好开始 新闻简报 了吗?

注册 Exercism,借助 33 个概念122 个练习 和真人导师指导,学习并掌握 Gleam,全部免费。