ruby在每个块中添加范围元素

ruby在每个块中添加范围元素,ruby,range,block,Ruby,Range,Block,如何将每个块中的范围元素添加到一起。例如: a = [[1..10, 13..20, 21..24], [34..39, 42..45], [50..55]] 结果: a = [[9+7+3],[5+3],[5]] a = [20, 8, 5] 您可以通过相应的first和last方法访问范围的第一个和最后一个元素插入(:+)对属于同一组的所有范围的部分距离求和 a.map { |ran­ges| range­s.map { |rang­e| range­.last - range­.fir

如何将每个块中的范围元素添加到一起。例如:

a = [[1..10, 13..20, 21..24], [34..39, 42..45], [50..55]]
结果:

a = [[9+7+3],[5+3],[5]]
a = [20, 8, 5]

您可以通过相应的
first
last
方法访问范围的第一个和最后一个元素<代码>插入(:+)对属于同一组的所有范围的部分距离求和

a.map { |ran­ges| range­s.map { |rang­e| range­.last - range­.first }.inj­ect(:+) }
=> [19, 8, 5]
或者,甚至更短,正如tokland使用Ruby 2.0所建议的:

a.map { |ran­ges| range­s.map(&:size).reduce(0, :+) }

您可以通过相应的
first
last
方法访问范围的第一个和最后一个元素<代码>插入(:+)对属于同一组的所有范围的部分距离求和

a.map { |ran­ges| range­s.map { |rang­e| range­.last - range­.first }.inj­ect(:+) }
=> [19, 8, 5]
或者,甚至更短,正如tokland使用Ruby 2.0所建议的:

a.map { |ran­ges| range­s.map(&:size).reduce(0, :+) }

Range
类有一个名为的方法。因此,我们可以这样做:

a.map { |ranges| ranges.inject(0) { |sum,rng| sum + rng.size - 1 } }

Range
类有一个名为的方法。因此,我们可以这样做:

a.map { |ranges| ranges.inject(0) { |sum,rng| sum + rng.size - 1 } }
Ruby 2.0:

a.map { |ran­ges| range­s.map(&:size).reduce(0, :+) }
a.map { |ranges| ranges.map { |r| r.size - 1 } .reduce(0, :+) }
Ruby 2.0:

a.map { |ran­ges| range­s.map(&:size).reduce(0, :+) }
a.map { |ranges| ranges.map { |r| r.size - 1 } .reduce(0, :+) }

为什么
1..10
等于10,而
13..20
等于7?后者应为8 IMO?但是除了1..10之外,你一直都这么做吗?是的,对不起,我改变了。它应该是10-1,20-13等等。所以你想求和比每个范围的条目数少1?不确定你的意思,但我喜欢求和((10-1)+(20-13)+(24-21)),etcok,你看过数组上的Ruby方法吗?问题是什么?为什么
1..10
等于10,而
13..20
等于7?后者应为8 IMO?但是除了1..10之外,你一直都这么做吗?是的,对不起,我改变了。它应该是10-1,20-13等等。所以你想求和比每个范围的条目数少1?不确定你的意思,但我喜欢求和((10-1)+(20-13)+(24-21)),etcok,你看过数组上的Ruby方法吗?有什么问题吗?这不会产生预期的结果这不会产生预期的结果