Menu
CoddyTech

回顾:体育联盟

本课属于 Coddy Ruby 学习旅程的“面向对象编程”单元。第 31 课,共 57 课。

challenge icon

挑战

困难

构建一个小型联赛积分榜。Team 包含 Comparable:积分更多的球队排名更高(胜一场得 3 分,平一场得 1 分);如果积分相同,则比较净胜球;如果净胜球也相同,则按名称的字母顺序排列,名称靠前的排名更高。record(scored, conceded) 会更新球队数据,而 to_s 会返回 Reds 7 pts, +3。League 包含 Enumerable:each 会逐个返回球队,play(line) 会为两支球队记录一场比赛的结果,例如 Reds 2-1 Blues(球队名称首次出现时会创建该球队),而 table 会使用 sort 按排名从高到低返回球队。League 中还包含了模块 Rankable,其中的 leader 会使用 max 返回排名最高的球队。

提供的代码会将每一行输入传给 play,然后打印带有名次的积分榜(1. Reds 7 pts, +3)、排名最高的球队,以及在所有比赛中都没有获胜的球队,这些球队通过 select 找出。

你的代码应写在 rankable.rb、team.rb 和 league.rb 中。main.rb 包含提供的输入/输出代码,不能编辑。

亲手试试

require_relative 'rankable'
require_relative 'team'
require_relative 'league'

# 提供的输入输出代码:保持原样
input = []
while (line = gets)
  input << line.chomp
end
league = League.new
input.each { |line| league.play(line) }
league.table.each_with_index { |t, i| puts "#{i + 1}. #{t}" }
puts "leader: #{league.leader&.name}"
winless = league.select { |t| t.wins.zero? }.map(&:name).sort
puts "no wins: #{winless.empty? ? "none" : winless.join(", ")}"

面向对象编程中的所有课

自己练习: Ruby 在线编译器