减少操作

时间:2016-01-31 22:00:13

标签: ruby reduce

这是我的一些演讲幻灯片:

words = %w{cat sheep bear}
words.reduce do |memo, word| memo.length > word.length ? memo : word end
#=> "sheep"

我不明白这个reduce操作中发生了什么。我不明白为什么打印"sheep"

我不明白memoword操作中发生了什么,但我认为我发现它只需要最长的单词并将其返回。

3 个答案:

答案 0 :(得分:3)

阅读Enumerable#reduce的文档,特别是:

  

如果指定一个块,则对于枚举中的每个元素,该块为   传递了累加器值(memo)和元素......结果变为新的   备忘录的价值。在迭代结束时,备忘录的最终值   是方法的返回值。

为了更加清晰,您的块可以重写为:

words.reduce do |longest, word|
  if longest.length > word.length
    longest
  else
    word
  end
end

要减少的块有两个参数:缩减的当前值(也称为备忘录累加器),以及正在处理的当前元素。块返回的值是它用作下一次迭代的备忘录的内容。

在英语中,这里的缩减是查看数组中的每个单词,并保留每次迭代后它看到的最长单词。最终结果是此处使用的reduce表达式返回数组中最长的单词,即sheep

如果您要逐步执行一次迭代,您会看到以下值传递给块:

  • 迭代0
    • longest = "cat"word = "cat"
    • 未指定备忘录的初始值,因此reduce使用数组中的第一个值(“cat”)作为默认备忘录
    • “cat”仍然是我们的备忘录
  • 迭代1
    • longest = "cat"word = "sheep"
    • 因为“羊”比“猫”长,“羊”成为我们的新备忘录
  • 迭代2
    • longest = "sheep"word = "bear"
    • “sheep”比“bear”长,所以它仍然是我们的备忘录
  • 完整
    • 我们遍历整个数组,reduce调用的结果值是我们当前备忘录的值,“sheep”

在某些语言中,Reduce也称为folding。当你将数组中的每个值滚动或折叠成某种聚合(减少的)最终值时,术语“折叠”就会有直观的意义。

答案 1 :(得分:1)

我想向您展示迭代过程,而不是解释它。

words = %w{cat sheep bear}
words.reduce do |memo, word|
  memo.length > word.length ? memo : word
end

变量words == [' cat',' sheep','承担']

# First iteration uses 'cat' and 'sheep'
'cat'.length > 'sheep'.length ? 'cat' : 'sheep'
# This ternary returns 'sheep' because 'sheep' is longer than 'cat'

目前:memo方法中的reduce ='绵羊'

# Second iteration uses `memo` which == 'sheep'
# Also uses 'bear'
'sheep'.length > 'bear'.length ? 'sheep' : 'bear'
# `sheep is longer than 'bear', so the ternary is true which returns `sheep`

目前:memo =='羊'

Reduce方法结束,因为它完成了迭代数组。 Reduce方法返回设置为memo

'sheep'

希望这并不会让你感到困惑。我想可能会显示单个迭代会很高兴看到

答案 2 :(得分:0)

首先,由于您没有为reduce指定默认值,因此将设置为'cat'。所以,现在备忘录是'猫'。 其次,你在reduce方法中的代码返回boolean值。默认情况下,如果此表达式为true - 则将重新分配默认值。这就是备忘录是“羊”的原因。 最后一个,因为没有比'羊'更长的单词,它将被返回。