我的代码运行正常,但在传递空数组时会出错。我理解为什么,但不知道如何解决它。
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
答案 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