0Pricing
Ruby Academy · 课时

reduce 与 each_with_object

聚合集合

reduce 与 each_with_object 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。

什么是 reduce

reduce(别名为 inject)会将所有元素合并为一个值。代码块会接收一个累加器和当前元素。

sum = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts sum

累加器的工作方式

累加器会在各次迭代之间保存不断累积的结果。代码块返回的任何值都会成为下一个累加器。

[1, 2, 3].reduce(0) do |acc, n|
  puts "acc=#{acc} n=#{n}"
  acc + n
end

不带初始值的 reduce

如果没有初始值,第一个元素会成为累加器,迭代从第二个元素开始。

puts [10, 20, 30].reduce { |acc, n| acc + n }

使用符号调用 reduce

对于简单运算符,可以传入 :+ 或 :* 这样的符号,而不使用代码块。

puts [1, 2, 3, 4].reduce(:+)
puts [1, 2, 3, 4].reduce(:*)

查找最大值

reduce 不仅可以计算总和,还能计算最大值等其他结果。

nums = [3, 9, 2, 7]
max = nums.reduce { |acc, n| n > acc ? n : acc }
puts max

构建字符串

累加器可以是任何类型,包括逐步构建的字符串。

letters = ["r", "u", "b", "y"]
word = letters.reduce("") { |acc, c| acc + c.upcase }
puts word

什么是 each_with_object

each_with_object 类似于 reduce,但您会为它提供一个可变对象,方法会自动返回该对象。您可以在代码块中修改这个对象。

result = [1, 2, 3].each_with_object([]) do |n, arr|
  arr << n * 2
end
puts result.inspect

构建哈希表

each_with_object 非常适合构建哈希表,因为您不必每次都返回该对象。

words = ["apple", "pear"]
lengths = words.each_with_object({}) do |w, h|
  h[w] = w.length
end
puts lengths

统计出现次数

将带默认值的哈希表与 each_with_object 结合,即可统计各项出现的次数。

votes = ["a", "b", "a", "a"]
tally = votes.each_with_object(Hash.new(0)) do |v, h|
  h[v] += 1
end
puts tally

reduce 与 each_with_object

当每一步都会返回一个新值(例如总和或乘积)时,使用 reduce。当您要修改同一个容器(例如数组或哈希表)时,使用 each_with_object。

puts [1, 2, 3].reduce(:+)
puts [1, 2, 3].each_with_object([]) { |n, a| a << n }.inspect

统计快捷方式

对于计数,Ruby 提供了内置的 tally 方法来自动完成这项工作。

puts ["a", "b", "a"].tally

快速检查

检查您的聚合技能。

回顾

现在您可以聚合集合:

  • 使用带累加器、初始值或符号的 reduce/inject
  • 使用 each_with_object 构建数组和哈希表
  • 使用 tally 快速计数
  • 需要新值时选择 reduce,需要可变容器时选择 each_with_object

下一门课程:数字与数学。

puts (1..5).reduce(:*)

常见问题解答

「reduce 与 each_with_object」课时是免费的吗?

是的 — 「reduce 与 each_with_object」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「reduce 与 each_with_object」这节课中我会学到什么?

聚合集合 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「reduce 与 each_with_object」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建范围
  2. Enumerable 模块
  3. map、select、reject
  4. reduce 与 each_with_object
← 返回 Ruby Academy