📅  最后修改于: 2023-12-03 15:04:56.785000             🧑  作者: Mango
在Ruby on Rails中,我们可以使用Array#each_with_object
和Hash的解构赋值来实现数组的折叠。这个技巧也被称为“inject”或“reduce”。
让我们从一个非常简单的例子开始。假设我们想要将给定数组中的所有数字相加。我们可以使用以下方法来实现:
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) { |result, number| result + number }
puts "The sum is #{sum}"
这里,我们将0作为折叠的初始值传递给inject
方法。然后,我们通过传递一个块来定义我们的折叠操作。在每次迭代中,我们的块将接收两个参数:之前的折叠结果和当前数组元素。我们将它们相加,然后返回新的折叠结果。
上面的代码可以稍微优化一下,使得它更具可读性:
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) do |result, number|
result + number
end
puts "The sum is #{sum}"
在这里,我们使用do/end
语法块替换了大括号。这通常更容易阅读。此外,我们还使块内部的代码与块标识更有空间的分离。
另一个使用each_with_object
方法的选择也可以用于折叠数组。这种方法涉及到传递一个绑定对象或哈希表,以存储折叠结果:
numbers = [1, 2, 3, 4, 5]
sum = numbers.each_with_object(0) { |number, result| result += number }
puts "The sum is #{sum}"
在这里,我们将0作为each_with_object
方法的第一个参数来初始化折叠结果。然后,我们使用块来迭代数组中的每个元素。我们在块内部添加了一个语句,对结果进行了更新。
这里也可以使代码更具可读性:
numbers = [1, 2, 3, 4, 5]
sum = numbers.each_with_object(0) do |number, result|
result += number
end
puts "The sum is #{sum}"
这里,我们使用多行块语法来使代码更加容易阅读和理解。 end
关键字在一个单独的行,以便更加突出块的范围。
我们还可以使用解构赋值来获得折叠的结果和元素:
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject([0, 0]) { |(sum, index), number| [sum + number, index + 1] }
puts "The sum is #{sum[0]} and the count is #{sum[1]}"
这里,我们将inject
的初始值数组设置为[0, 0]
。在块内,我们使用解构来将结果分解为sum
和index
变量。我们将它们相应地更新,并将它们放回一个新的数组中。
教程中以Ruby on Rails 折叠数组 - Ruby为主题,介绍了使用Array#each_with_object
和Hash的解构赋值来实现数组的折叠。从最基本的代码示例,到增加代码可读性,再到使用each_with_object
方法和解构,都非常详细地讲解了如何实现。我们了解到,在Ruby中实现数组的折叠有多种方法,可以根据自己的需求选择不同的方法。