让我们从创建一个实例数组开始。
class C
def initialize(a,b,c)
@a, @b, @c = a, b, c
end
end
arr = [[1,2,3], [4,5,6], [7,8,9]].map { |a| C.new(*a) }
#=> [#<C:0x00005a4282c2d980 @a=1, @b=2, @c=3>,
# #<C:0x00005a4282c2d5c0 @a=4, @b=5, @c=6>,
# #<C:0x00005a4282c2d3b8 @a=7, @b=8, @c=9>]
然后
ivs = arr.first.instance_variables
#=> [:@a, :@b, :@c]
arr.map { |i| ivs.map { |v| i.instance_variable_get(v) } }.
transpose.
map(&:sum)
#=> [12, 15, 18]
步骤如下。
a = arr.map { |i| ivs.map { |v| i.instance_variable_get(v) } }
#=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = a.transpose
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
c = b.map(&:sum)
#=> [12, 15, 18]
如果需要标签:
ivs = arr.first.instance_variables
ivs.zip(arr.map {|i| ivs.map {|v| i.instance_variable_get(v)}}.
transpose.
map(&:sum)).
to_h
#=> {:@a=>12, :@b=>15, :@c=>18}
如果只需要一些实例变量的总和,比如@a 和@c,只需更改ivs:
ivs = [:@a, :@c]
ivs.zip(arr.map {|i| ivs.map {|v| i.instance_variable_get(v)}}.
transpose.
map(&:sum)).
to_h
#=> {:@a=>12, :@c=>18}