我正在做一个分配,在其中我创建了两个方法(加法和减法),这些方法使用splatter方法获取参数。我试图修改每个方法,以便我也可以将数组作为参数传递。我尝试使用条件语句来检查我的参数是否为数组,但这没用。
这是我的代码:
class Math
def initialize
puts "Welcome to Math Dojo"
self
end
def add (*nums)
@sum = nums.reduce :+
if nums == []
nums.reduce :+
puts "The sum is #{@sum}"
self
end
def subtract (*nums)
@diff = nums.reduce :-
if nums == []
nums.reduce :-
end
puts "The difference is #{@diff}"
self
end
end
我需要代码通过以下测试:
challenge1 = Math.new.add(2).add(2, 5).subtract(3, 2) # => 4
challenge2 = Math.new.add(1).add([3, 5, 7, 8], [2, 4.3, 1.25]).subtract([2,3], [1.1, 2.3])
challenge3 = Math.new.add(2, 5).subtract(9, 3, 5, 2)
该代码当前将通过Challenge1和Challenge3。如何修改它以通过全部三个?
答案 0 :(得分:1)
即使是将数组中的参数与数字混合,也不会增加复杂性,因为包含数组的数组可能只有在获得总数之前才需要弄平它们。
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
答案 1 :(得分:0)
几件事:
nums.is_a?(Array)
。 nums == []
检查nums是否为空数组。nums
始终是一个数组。您真正要确定的是nums
中的任何元素是否为数组,如果是,则要减少它们。您要么需要停止在nums
上使用reduce(因为它不适用于数组),要么执行更简单的路由和flatten!
数组。https://ruby-doc.org/core-2.2.0/Array.html#method-i-flatten-21
flatten!
接受一个数组数组并将其变成单个数组。它会修改数组的位置,而不是创建一个新数组,这意味着它比flatten
对应的数组(确实有位置)更高效。
检查一下:
class Math
def initialize
puts "Welcome to Math Dojo"
self
end
def add (*nums)
nums.flatten!
@sum = nums.reduce :+
puts "The sum is #{@sum}"
self
end
def subtract (*nums)
nums.flatten!
@diff = nums.reduce :-
puts "The difference is #{@diff}"
self
end
end