图书和会员
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 50 课,共 57 课。
在这个项目中,你将使用引用类构建图书馆系统的核心,因为书籍和会员会在程序运行期间发生变化:书会被借出和归还,会员的借阅列表也会增加或减少。一个 Library 对象会接收命令,每行一条,并对每条命令作出响应。通过五个步骤,你将学习如何添加书籍和会员、借出和收回书籍、搜索目录以及打印报告。
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT每个文件中都有一个类。Book.R 和 Member.R 存放两个小类,Library.R 存放负责将它们保存在两个具名列表中并处理命令的类。由于 RC 对象是引用,修改从列表中查找到的书籍,也会修改图书馆中的那本书:
Book <- setRefClass("Book", fields = list(id = "numeric", title = "character", borrower = "character"))
books <- list()
books[["7"]] <- Book$new(id = 7, title = "Dune")
b <- books[["7"]]
b$borrower <- "ada"
cat(books[["7"]]$borrower, is.null(books[["9"]]))输出:
ada TRUEhandle(line) 会拆分命令,并根据命令的第一个词使用 switch() 调用对应命令的方法。每个方法都会将回复作为字符向量返回,因此像 REPORT 这样的命令可以回复多行内容。标题可以包含空格,所以标题就是 id 后面的所有内容:
p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")输出:
7: The Hobbit挑战
简单已提供 Book 类(字段为 id、title、borrower)和 Member 类(字段为 name、borrowed)。请在 Library.R 中完成 Library 的两个方法:
add_book(id, title)用于处理ADD_BOOK <id> <title>:将新书存储在as.character(id)下,并回复added book 1: Dune;如果该 id 已被占用,则回复book 1 exists。join(name)用于处理JOIN <name>:将新成员存储在其姓名对应的位置,并回复welcome ada;如果该姓名已存在,则回复ada is already a member。
提供的代码会将每一行输入发送给 lib$handle(line),并将每条返回的回复单独打印在一行上。成员姓名是单个小写单词,书籍 id 是整数,输入中只包含目前描述的命令。对于其他任何命令,回复 unknown command。
请将代码写在 Book.R、Member.R 和 Library.R 中。main.R 包含提供的输入/输出代码,不能编辑。
亲手试试
source("Book.R")
source("Member.R")
source("Library.R")
# 提供的输入/输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: R 在线编译器