在for循环中断之前清除数组

时间:2015-08-09 22:08:56

标签: arrays ruby

我试图在数组中展平整数数组,如果数组中的对象不是整数则抛出错误。 以下是我的方法:

def flattenArray(oldArray)
  result = [] 
  for i in oldArray do
    if i.is_a? Integer
      result.push(i)
    elsif i.is_a? Array
      result += flattenArray(i)
    else
      print("\nError: '#{i}', is invalid, only flattens arrays with type integer.")
      print("\n'#{i}' was not flattened with the array \n")
      # This doesn't work the way I expect
      return result.clear
      break
    end
  end
  return result
end

以下是一些要测试的示例数组:

sample1 = [1,[2,[3]],4]
sample2 = [1,['be',[3]],4]
sample3 = [sample1,[2,[3,4]],[5]]
sample4 = [sample1, [1.5, 3],4, [5,6],7,[[8]]]

flattenArray(sample1) # => [1, 2, 3, 4] (expected)
flattenArray(sample2) # => [1, 3, 4] (expected [])
flattenArray(sample3) # => [1, 2, 3, 4, 2, 3, 4, 5] (expected)
flattenArray(sample4) # => [1, 2, 3, 4, 3, 4, 5, 6, 7, 8] (expected [])

错误打印正常,但是当我尝试在我的else语句中中断并清除数组时,它实际上不会清除数组,而是保留之前传递的整数错误。我似乎无法弄清楚如何实现这一目标。任何指向正确方向的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

您的return仅从最里面的递归调用返回。如果要中止处理整个数组,则需要检测结果为空并一直中止:

    elsif i.is_a? Array
      # this will just append [] if the recursive call aborts
      result += flattenArray(i) 
    else

相反,你想要这样的东西:

    elsif i.is_a? Array
      subResult = flattenArray(i) 
      if subResult.empty? then
         return result.clear
      else
         result += subResult
      end

当然,如果你想允许空的内部数组,这将是一个问题。使用空数组来表示错误情况在Ruby中是不明确的,也不是非惯用的。最好返回nil或提出异常。

      else
        raise ArgumentError, "Noninteger array element" 
      end

答案 1 :(得分:1)

首先,您的结果无法复制。

由于引发错误时未返回空数组的原因是因为每个递归调用result不同。例如,对于[1,['be',[3]],4],数组['be',[3]]会导致错误,并为该部分返回一个空数组,但这不会使整个返回值为空数组。返回的整个数组是[1, 4](与您声明的不同),['be',[3]]部分映射为空。