【发布时间】:2018-10-08 14:27:42
【问题描述】:
我有一个班级,有 50 个随机分数的随机人,存储在哈希数组中:
def initialize
# adding fake names and numbers
require 'faker'
@people = []
(1..50).each do
@people << { name: Faker::Name.first_name, score: Faker::Number.between(1, 1000).to_i }
end
end
top 方法(如下)将返回字符串中排名前 N 的人及其分数。作为 ruby 的新人,我认为可能有一种方法可以让这变得更简单。方法如下:
def top(number=10)
top_people = @people.group_by { |person| person[:score] }
.sort_by { |key, value| -key } # largest -> smallest
.first(number)
.map(&:last)
.flatten
.map { |person| "#{person[:name]} (#{person[:score]})" }
.join(", ")
puts "The top #{number} are here: #{top_people}"
end
供参考,使用 Ruby 2.3.3
【问题讨论】:
-
A> 为此编写自动化测试,因此更改代码更安全。 B>
"#{person[:name]} (#{person[:score]})"可以是'%{name} (%{score})' % person。并且 C> 不要编写连续语句。在单独的行中使用top_people = top_people.sort_by...。 -
@Phlip 重复
top_people = ...真的很惯用吗?我会认为代码有异味,因为所有中间行都不会是top_people,而是sorted_groups、top_groups等。只有在扁平化之后,你才真正拥有top_people -
我正在维护一个项目,其中有人将所有内容都塞进一个语句中,没有中间变量和大量换行点\n。像你的。请不要让我开始! C-;
-
@Phlip 我指的是局部变量名称。请参阅我的更新答案。
-
(1..50).each可能是50.times