Как изменить мои функции сложения и вычитания, чтобы массивы можно было передавать в качестве аргументов с помощью Ruby? - PullRequest
0 голосов
/ 06 апреля 2019

Я работаю над заданием, в котором я создал два метода (сложение и вычитание), которые получают параметры, используя метод 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)

Код в настоящее время пройдет вызов1 и вызов3.Как мне изменить его, чтобы пройти все три?

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Добавление аргументов, являющихся массивами, даже если они смешаны с числами, не увеличивает сложность, поскольку массивы, содержащие массивы и, возможно, числа, должны быть сведены только до получения итогов.

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
0 голосов
/ 06 апреля 2019

Несколько вещей:

  1. Если вы пытаетесь определить, является ли nums массивом, вы должны сделать nums.is_a?(Array). nums == [] проверяет, является ли nums пустым массивом.
  2. nums всегда массив. То, что вы действительно пытаетесь определить, является ли какой-либо из элементов внутри nums массивом, и если да, то хотите уменьшить их. Вам нужно либо прекратить использовать метод Reduce на nums (поскольку он не будет работать для массивов), либо выполнить более простой маршрут и flatten! массив.

https://ruby -doc.org / ядро-2.2.0 / Array.html # метод-я-сплющить-21 * +1018 *

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
...