如何修改加减函数,以便可以使用Ruby作为参数传递数组?

时间:2019-04-06 03:40:27

标签: arrays ruby methods addition

我正在做一个分配,在其中我创建了两个方法(加法和减法),这些方法使用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。如何修改它以通过全部三个?

2 个答案:

答案 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)

几件事:

  1. 如果您要确定nums是否是数组,则可以执行nums.is_a?(Array)nums == []检查nums是否为空数组。
  2. 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