код получает ошибки при передаче пустого массива

92
13

Мой код работает нормально, но получает ошибки при передаче пустого массива. Я понимаю, почему, но не знаю, как это исправить.

def format_comma_and(array)

output =""

if array.empty?
return output
else
array.each.with_index do |x,i|
if array.length-2 == i
output << x + " and "
elsif array.length-1 == i
output << x
else
output << x + ", "
end
end
return output
end

end

спросил(а) 2016-04-02T23:21:00+03:00 5 лет, 6 месяцев назад
1
Решение
65

Вы можете добавить "comma_and" следующим образом:

   def format_comma_and(a = [])
a[0...-1].any? ? a[0...-1] * ',' + " and #{a[-1]}" : "#{a[-1]}"
end

ответил(а) 2016-04-03T00:24:00+03:00 5 лет, 6 месяцев назад
46

Кажется, что вы действительно хотите написать что-то вроде этого:

def format_comma_and(array)
return if array.empty?
*head, tail = array
[head.join(", "), tail].join(" and ")
end
format_comma_and([1,2,3,4,5])
#=> "1, 2, 3, 4 and 5"
format_comma_and([1,2])
#=> "1 and 2"
format_comma_and([])
#=> nil

ответил(а) 2016-04-02T23:54:00+03:00 5 лет, 6 месяцев назад
46

Я просто проверил ваш код, и он не вызывает ошибку, когда ему передается пустой массив.

Однако это приведет к ошибке, если вы передадите следующий аргумент: [nil].

each_with_index работает с каждым элементом массива. Если первый элемент равен nil (это отличается от пустого массива), тогда ваш код пытается вызвать output = nil + " and "

Быстрое исправление заключалось бы в том, чтобы вызвать compact на вашем массиве, то есть поставить вверху метода:

array = array.compact

Это приведет к удалению всех значений nil.

Или вы можете отфильтровать свой массив, чтобы избавиться от каких-либо недопустимых элементов. Я не уверен, что ваши инструкции, но см. Следующий пример:

array = [ nil, false, "string", 111, {}, [] ]
array = array.select { |item| [String, Integer].include?(item.class) }
array == ["string", 111] # => true

ответил(а) 2016-04-02T23:53:00+03:00 5 лет, 6 месяцев назад
47

Очень просто добавить значение по умолчанию для аргумента метода в top format_comma_and(array=[]), если позволяет сказать, что метод вызывается без параметра. (т.е. format_comma_and()), то nil отправляется в ваш метод, который затем может вызвать ошибку, подобную этой, так что если есть значение по умолчанию, это не должно происходить:

def format_comma_and(array=[])

output =""

if array.empty?
return output
else
array.each.with_index do |x,i|
if array.length-2 == i
output << x + " and "
elsif array.length-1 == i
output << x
else
output << x + ", "
end
end
return output
end

end

В качестве альтернативы вы можете сделать это:

def format_comma_and(array=[])
return "" if array.size < 1
return "#{array[0]}" if array.size == 1
array[0..-2].join(", ") + " and #{array[-1]}"
end

format_comma_and([1,2,3,4])
#=> "1, 2, 3 and 4"
format_comma_and([1,2,3])
#=> "1, 2 and 3"
format_comma_and([1,2])
#=> "1 and 2"
format_comma_and([1])
#=> "1"
format_comma_and([])
#=> ""
format_comma_and()
#=> ""

ответил(а) 2016-04-02T23:51:00+03:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема