Как вернуть «неверный» вместо суммы массива, когда входные данные являются строкой или плавающей точкой - PullRequest
0 голосов
/ 22 января 2020

Я хочу вернуть массив сумм, кратных 3 и 5 от 0 до n. И я хочу вернуть "invalid", когда вводом является строка, число с плавающей запятой или <0 </p>

def is_multiple_of_3_or_5(n)
    if n.class == Integer && n > 0
        n % 3 == 0 || n % 5 == 0 ? true : false
    else
        puts "invalid"
    end
end

def sum_of_3_and_5_multiples(n)

    if n.class == Integer
        i = 0
        array_of_multiples_of_3_and_5 = Array.new

        while i < n     
            array_of_multiples_of_3_and_5 << i if is_multiple_of_3_or_5(i) == true
            i += 1
        end

        array_of_multiples_of_3_and_5.inject(0, :+)
    end
end

sum_of_3_and_5_multiples(-1)

Чтобы получить суммы, кратные 3 и 5, я получил это, но когда я пытаюсь с -1, то верните мне 0 вместо "invalid", with "строки", которые возвращают мне ошибку.

Ответы [ 5 ]

1 голос
/ 23 января 2020

Альтернативный подробный вариант, использующий патч обезьяны для класса String и пользовательского класса, крадущийся из ответа Кэри ({ ссылка }), но с тремя точками Range для исключения крайняя ценность.


Исправление класса String для использования таких методов, как этот Числовое # целое число? и Числовое # положительное? . Я бы предложил использовать Ядро # повышение в случае ошибки.
module MyStringPatch
  def integer?
    false
  end
  def positive?
    false
  end
end

String.include MyStringPatch


Написание пользовательского класса
class MyNumber
  def initialize(n)
    raise 'Invalid' unless n.integer? && n.positive?
    @n = n
  end
  def sum_of_3_and_5_multiples
    (((0...@n).step(3).to_a + (0...@n).step(5).to_a).uniq).sum
  end
end


Наконец, используя его
n = 32
my_number = MyNumber.new(n)
p my_number.sum_of_3_and_5_multiples
#=> 225

или ...in initialize': Invalid (RuntimeError) в случае n = "32" или n = -32 или n = 32.0.

1 голос
/ 23 января 2020

Это можно сделать следующим образом.

def sum_of_3_and_5_multiples(n)
  case n
  when Float, String, -Float::INFINITY...0
    return 'invalid'
  end
  ((0..n).step(3).to_a + (0..n).step(5).to_a).uniq
end

sum_of_3_and_5_multiples(11.5)
  #=> "invalid" 
sum_of_3_and_5_multiples("11")
  #=> "invalid" 
sum_of_3_and_5_multiples(-340)
  #=> "invalid" 
sum_of_3_and_5_multiples(15)
  #=> [0, 3, 6, 9, 12, 15, 5, 10] 
sum_of_3_and_5_multiples(87)
  #=> [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45,
  #    48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87,
  #    5, 10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85] 
1 голос
/ 22 января 2020

Вы не вставили никакой код в ваш метод sum_of_3_and_5_multiples для обработки того, что происходит, если is_multiple_of_3_or_5 недопустим (или, если выразиться иначе, строка). Вам также не нужно puts 'invalid', так как это возвращает значение NULL. Просто «неверный» будет делать:

def is_multiple_of_3_or_5(n)
  if n.class == Integer && n > 0
    n % 3 == 0 || n % 5 == 0 ? true : false
  else
    "invalid"
  end
end

def sum_of_3_and_5_multiples(n)
  if n.class == Integer
    i = 0
    array_of_multiples_of_3_and_5 = Array.new

    while i < n
      return "invalid" if is_multiple_of_3_or_5(i).is_a?(String)
      array_of_multiples_of_3_and_5 << i if is_multiple_of_3_or_5(i) == true
      i += 1
    end

    array_of_multiples_of_3_and_5.inject(0, :+)
  end
end

sum_of_3_and_5_multiples(-1)
=> "invalid"
0 голосов
/ 22 января 2020

Я нашел это! это сработало!

def is_multiple_of_3_or_5(n)
        n % 3 == 0 || n % 5 == 0 || n == 0 ? true : false
end

def sum_of_3_and_5_multiples(n)

    puts n.class

    if n.class == Integer && n >= 0
        i = 0
        array_of_multiples_of_3_and_5 = Array.new

        while i < n
            array_of_multiples_of_3_and_5 << i if is_multiple_of_3_or_5(i) == true
            i += 1
        end

        return array_of_multiples_of_3_and_5.inject(0, :+)
    end

    if n.class != Integer || n < 0
        return "invalid"
    end
end

спасибо за помощь, которая была полезна!

0 голосов
/ 22 января 2020

Вы можете использовать что-то вроде: вернуть «неверный», если n.is_a? Целое число || n.positive?

Взгляните на: https://rubystyle.guide/ может помочь

...