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

问题描述 投票:0回答:2

我正在进行一项任务,我创建了两个使用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。如何修改它以通过所有三个?

arrays ruby methods addition
2个回答
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

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
© www.soinside.com 2019 - 2024. All rights reserved.