图书与读者
本课属于 Coddy Ruby 学习旅程的“面向对象编程”单元。第 50 课,共 57 课。
在这个项目中,你将构建图书馆系统的核心。一个 Library 对象会接收命令,每行一条,并逐条回复。通过 5 个步骤,它将学会添加图书和成员、借出和归还图书、搜索目录以及打印报告。
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT这个数据模型使用了本单元讲过的内容。Book 通过只读属性公开 id 和 title,通过访问器公开 borrower,并提供谓词方法 available?。Member 用数组保存其借阅记录的 ID。每个类都放在各自的文件中,分别是 book.rb、member.rb 和 library.rb。图书馆将这两类对象都保存在哈希中,只有它自己的方法会访问这些哈希:
class Book
attr_reader :id, :title
attr_accessor :borrower
def initialize(id, title)
@id = id
@title = title
@borrower = nil
end
def available?
borrower.nil?
end
end
books = { 1 => Book.new(1, "Dune") }
books[1].borrower = "ada"
puts books[1].available?输出:
falsehandle(line) 会拆分命令,并根据第一个词使用 case 进行分支处理。每个分支都会将回复作为数组返回,因此像 REPORT 这样的命令可以回复多行内容,而 return 会提前退出并返回错误回复。书名可以包含空格,所以它是 id 后面的所有内容:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"输出:
7: The Hobbit挑战
简单完成 Library#handle,实现前两个命令:
ADD_BOOK id title:存储一本新的可借阅图书,并回复added book 1: Dune;如果 id 已被占用,则回复book 1 exists。JOIN name:添加一名会员,并回复welcome ada;如果该姓名已存在,则回复ada is already a member。
提供的代码会将每一行输入传递给 library.handle(line),并将每条返回的回复单独打印一行。会员姓名由单个小写单词组成,图书 id 是整数,输入中只包含目前描述的命令。其他任何命令都会回复 unknown command。
你的代码写在 book.rb、member.rb 和 library.rb 中。main.rb 中包含提供的输入/输出代码,不能修改。
亲手试试
require_relative 'book'
require_relative 'member'
require_relative 'library'
# 提供的输入/输出代码:保持原样。
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Ruby 在线编译器