count、all?、any?、none?
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 24 课,共 56 课。
这 4 个小型 Enumerable 方法可以回答有关集合的问题,无需你编写循环。
count 返回满足代码块条件的元素数量:
[1, 2, 3, 4, 5].count { |n| n.even? } # 2
[1, 2, 3, 4, 5].count # 5(没有代码块,统计总数)当每个元素都满足代码块中的条件时,all? 的结果为 true:
[2, 4, 6].all? { |n| n.even? } # true
[2, 4, 7].all? { |n| n.even? } # false至少有一个满足条件时,any? 的结果为 true:
[1, 2, 3].any? { |n| n.even? } # true
[1, 3, 5].any? { |n| n.even? } # false当它们都不满足条件时,none? 的值为 true:
[1, 3, 5].none? { |n| n.even? } # true这些方法会短路,any? 遇到第一个匹配项时就会停止,all? 遇到第一个不匹配项时就会停止。它们的开销很小。
挑战
简单读取一个以逗号分隔的测试成绩列表(整数)。满足以下条件时,班级的成绩才算有效且及格:
- 没有任何成绩是负数(表示有测试成绩未记录)
- 所有成绩都不超过
100 - 至少有一个成绩恰好是
100(至少有一个满分) - 至少有 3 个成绩是
>= 70(使用count)
准确输出一行:
- 四个条件都满足时,输出
Valid: <count> passing(count是成绩>= 70的数量) - 否则输出
Invalid
对于输入 72,80,100,65,90:有 4 个成绩 >= 70,没有负数,所有成绩都 <= 100,其中一个是 100,因此输出 Valid: 4 passing。
对于 72,80,90:有 3 个及格成绩,但没有满分,因此输出 Invalid。
亲手试试
scores = gets.chomp.split(",").map(&:to_i)
# TODO:结合 all?、any?、none? 和 count,判断是 Valid 还是 Invalid
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
5Enumerable 的强大功能
Select 与 Reject链式调用 MapReduce / Injectcount、all?、any?、none?group_by 与 partitionsort_by、min_by、max_by回顾:数据管道自己练习: Ruby 在线编译器