如何在数组中添加所有偶数(Ruby)

时间:2015-01-22 22:52:02

标签: ruby arrays

我正在尝试学习如何使用简化并且不了解为什么它不能正常运行。试图将数组的所有元素加起来均匀。

array = [1, 2, 3, 4, 5, 6]

array.reduce(0) do |result, value|
  result + value if value.even?
  result
end

2 个答案:

答案 0 :(得分:2)

在评论中, Doorknob 正确地确定您的具体示例有拼写错误。您需要使用result += value if value.even?,而不是result + value if value.even?。但是,通常情况下,您希望避免在reduceselectmap等函数中改变状态。

这些函数来自函数式编程语言,它们通常用纯表达式编写。您通常希望编写这些函数的主体,以便它们包含一个返回新值的简单表达式。

如果您打算使用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
相关问题