传递空数组时代码会出错

时间:2016-04-02 20:21:42

标签: ruby

我的代码运行正常,但在传递空数组时会出错。我理解为什么,但不知道如何解决它。

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

4 个答案:

答案 0 :(得分:1)

您可以这样添加“comma_and”:

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

答案 1 :(得分:0)

很简单,只需在顶部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()
#=> ""

答案 2 :(得分:0)

我刚测试了你的代码,它在传递空数组时不会引发错误。

但是,如果传递以下参数,则会引发错误:[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

答案 3 :(得分:0)

看来你真的想写这样的东西:

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