我正在尝试学习如何使用简化并且不了解为什么它不能正常运行。试图将数组的所有元素加起来均匀。
array = [1, 2, 3, 4, 5, 6]
array.reduce(0) do |result, value|
result + value if value.even?
result
end
答案 0 :(得分:2)
在评论中, Doorknob 正确地确定您的具体示例有拼写错误。您需要使用result += value if value.even?
,而不是result + value if value.even?
。但是,通常情况下,您希望避免在reduce
,select
或map
等函数中改变状态。
这些函数来自函数式编程语言,它们通常用纯表达式编写。您通常希望编写这些函数的主体,以便它们包含一个返回新值的简单表达式。
如果您打算使用reduce
,您可能需要考虑将其与select
函数配对并使用简单的链接表达式。
array.select(&:even?).reduce(:+)
select
使用给定函数过滤数组。在这种情况下,它只会选择可被整除的值。此示例中的reduce
正在通过符号传递对+
函数的引用,该函数将累积每个已过滤数组的值。
这两个函数都可以使用块编写,您可能更熟悉它们:
array.select { |value| value.even? }.reduce { |result, value| result + value }
答案 1 :(得分:1)
试试这个:
array = [1, 2, 3, 4, 5, 6]
evens = array.reduce(0) do |result, value|
p "#{result} #{value}"
value % 2 == 0 ? result + value : result
end
p evens # => 12