什么是破坏性的?

时间:2013-05-22 03:10:29

标签: ruby arrays flatten

我知道Ruby有很多方法,特别是在数组或类似对象的数组上,例如sortflatten。但是,这些方法还有一个双胞胎(带有感叹号的方式),如sort!flatten!

现在我的问题是:

  • flattenflatten!之间有什么区别(破坏性展平)?
  • 一个更普遍的问题,为什么称它为破坏性的?

2 个答案:

答案 0 :(得分:7)

不同之处仅在于flatten返回数组的副本(一个展平的新数组),flatten!进行“就地”修改或“破坏性修改”。破坏性一词意味着它修改了原始数组。当您知道最终结果是什么时,这非常有用,并且不介意原始结构是否发生变化。

正如@padde指出的那样,它会消耗更少的内存来破坏性地执行某些操作,因为结构可能很大并且复制会很昂贵。

但是,如果您想保留原始结构,最好使用该方法并制作副本。

以下是使用sortsort!的示例。

a = [9, 1, 6, 5, 3]
b = a.sort
c = [7, 6, 3]
c.sort!

内容:

a = [9, 1, 6, 5, 3]
b = [1, 3, 5, 6, 9]
c = [3, 6, 7]

答案 1 :(得分:1)

  

Array#flatten: - 返回一个新的数组,该数组是self的一维展平(递归)。

     

Array#flatten!: - 让自己变得平坦。

a = [1,2,[3,4]]
p a.object_id #=> 74502050
p a.flatten.object_id #=> 74501960
p a.flatten!.object_id #=> 74502050

flatten创建一个新的数组对象,因为a.flatten.object_id显示的值与a.object_id不同。

flatten!修改a引用的对象,a.flatten!.object_id显示为74502050