Menu
CoddyTech

图书与读者

本课属于 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?

输出:

false

handle(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
challenge icon

挑战

简单

完成 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Ruby 在线编译器