如何简化Ruby类中返回Top N人员信息的top方法?
简化你的Ruby类
top方法指南 嘿,作为Ruby新手能主动思考代码优化,这点超棒!咱们来把这个top方法改得更简洁、更符合Ruby的优雅风格~
首先,你的核心需求是:从@people数组中取出分数最高的前number个人员,然后格式化成可读的字符串。基于这个需求,我们可以用Ruby内置的链式方法一步到位,完全不用复杂的循环或者临时变量。
最简实现版本
def top(number = 10) @people.sort_by { |person| -person[:score] } .take(number) .map { |person| "#{person[:name]}: #{person[:score]}" } .join("\n") end
逐行解释为啥这么写:
sort_by { |person| -person[:score] }:按分数降序排列数组。相比于传统的sort { |a,b| b[:score] <=> a[:score] },这种写法更简洁,而且性能更优(sort_by只计算一次排序键)。take(number):直接提取数组的前number个元素,如果number大于数组总长度(比如传入20但只有15个人),它会自动取全部元素,不用额外做边界判断。map { ... }:把每个人员哈希转换成你需要的字符串格式,比如"张三: 950"。join("\n"):把格式化后的字符串数组拼接成换行分隔的大字符串,方便直接输出。如果想要逗号分隔的格式,改成join(", ")就行。
进阶优化:加上排名
如果想让输出更直观,比如显示名次,可以用with_index给每个元素加上排名:
def top(number = 10) @people.sort_by { |person| -person[:score] } .take(number) .with_index(1) { |person, rank| "#{rank}. #{person[:name]}: #{person[:score]}" } .join("\n") end
这样输出会变成:
1. Emma: 987 2. Liam: 965 3. Olivia: 920 ...
额外小提示
如果你担心sort_by会修改原数组,完全不用怕——sort_by返回的是一个新数组,原@people数组不会被改动。如果想避免重复排序(比如多次调用top),可以在initialize里提前排好序,但如果人员分数会动态变化,还是每次调用时排序更准确。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

