Добавление аргументов, являющихся массивами, даже если они смешаны с числами, не увеличивает сложность, поскольку массивы, содержащие массивы и, возможно, числа, должны быть сведены только до получения итогов.
class MyMath
attr_reader :tot
def initialize
@tot = 0
end
def add(*obj)
compute(*obj, :+)
end
def subtract(*obj)
compute(*obj, :-)
end
def multiply(*obj)
compute(*obj, :*)
end
def divide(*obj)
compute(*obj, :/)
end
def compute(*obj, op)
@tot = obj.flatten.reduce(@tot, op)
self
end
end
MyMath.new.add(2).add(2, 5).subtract(3, 2).tot
#=> 4
MyMath.new.add(2).add(2, 5).subtract(3, 2).multiply(2, 4).tot
#=> 32
MyMath.new.add(2).add(2, 5).subtract(3, 2).divide(2.0, 4.0).tot
#=> 0.5
MyMath.new.add(1).add([3, 5], [2, 4.3]).subtract([2,3], [1.1, 2.3]).tot
#=> 6.9
MyMath.new.add(2, 5).subtract(9, [3, 5], 2).tot
#=> -12