理解参数对.flatten方法的影响

时间:2014-01-29 12:30:22

标签: ruby

ruby​​ doc很好地解释了.flatten在没有参数的情况下做了什么。但是我不能为我的生活理解当1被传递以展平时发生的事情

flatten(level) → new_ary

  

返回一个新的数组,它是self的一维展平(递归)。也就是说,对于作为数组的每个元素,将其元素提取到新数组中。可选的level参数决定了flatten的递归级别

s = [ 1, 2, 3 ]           #=> [1, 2, 3]
t = [ 4, 5, 6, [7, 8] ]   #=> [4, 5, 6, [7, 8]]
a = [ s, t, 9, 10 ]       #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
a.flatten                 #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = [ 1, 2, [3, [4, 5] ] ]
a.flatten(1)              #=> [1, 2, 3, [4, 5]]

通过'递归'是否意味着参数直接影响'.flatten'执行的操作数量,以将多维数组转换为常规奇异数组?超级磨砂膏可以理解的术语在这里将非常受欢迎。

谢谢。

2 个答案:

答案 0 :(得分:0)

基本上,对flatten的论证意味着试图压扁结构应该有多深。

a = [ 1, 2, [3, [4, 5] ] ]

# where
[ 1, 2, [3, [4, 5] ] ] # level 0 (original array)
[3, [4, 5] ]           # level 1
[4, 5]                 # level 2

所以,如果你传递1,它将只会深入一级并将level-2数组视为单个元素,并且不会递归到它中。所以,

a.flatten(1)              #=> [1, 2, 3, [4, 5]]

答案 1 :(得分:0)

他的回答中提到的@Sergio Tulentsev是正确的。但是我想在这里添加一件事 -

如果您不提供任何参数,那么展平将以递归方式在所有嵌套级别中发生。那是a.flatten[1, 2, 3, 4, 5]

不要认为a.flattena.flatten(0)相同。不,他们的工作方式不同。如果您将嵌套级别号码作为012传递,那么当您询问方法时,将会发生展平。但是如果你没有传递任何参数,那么该方法就可以正常工作,即它会创建一个单级数组,也可以通过打破所有更深层次的嵌套数组。

a = [ 1, 2, [3, [4, [5,[6]]] ] ]
# see no nested level is here, all are flattened.
a.flatten # => [1, 2, 3, 4, 5, 6]