我正在进行一项任务,我创建了两个使用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。如何修改它以通过所有三个?
添加数组的参数,即使它们与数字混合,也不会增加复杂性,因为包含数组和可能数字的数组只需要在获得总数之前展平。
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
一些东西:
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