这是我的一些演讲幻灯片:
words = %w{cat sheep bear}
words.reduce do |memo, word| memo.length > word.length ? memo : word end
#=> "sheep"
我不明白这个reduce
操作中发生了什么。我不明白为什么打印"sheep"
。
我不明白memo
,word
操作中发生了什么,但我认为我发现它只需要最长的单词并将其返回。
答案 0 :(得分:3)
阅读Enumerable#reduce
的文档,特别是:
如果指定一个块,则对于枚举中的每个元素,该块为 传递了累加器值(memo)和元素......结果变为新的 备忘录的价值。在迭代结束时,备忘录的最终值 是方法的返回值。
为了更加清晰,您的块可以重写为:
words.reduce do |longest, word|
if longest.length > word.length
longest
else
word
end
end
要减少的块有两个参数:缩减的当前值(也称为备忘录或累加器),以及正在处理的当前元素。块返回的值是它用作下一次迭代的备忘录的内容。
在英语中,这里的缩减是查看数组中的每个单词,并保留每次迭代后它看到的最长单词。最终结果是此处使用的reduce
表达式返回数组中最长的单词,即sheep
。
如果您要逐步执行一次迭代,您会看到以下值传递给块:
longest = "cat"
,word = "cat"
reduce
使用数组中的第一个值(“cat”)作为默认备忘录longest = "cat"
,word = "sheep"
longest = "sheep"
,word = "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 - 则将重新分配默认值。这就是备忘录是“羊”的原因。 最后一个,因为没有比'羊'更长的单词,它将被返回。