4

I know that Ruby has many methods, especially on array or array like objects, for example sort or flatten. However, these methods also have a twin (the one with an exclamation mark) like sort! and flatten!.

Now my questions are:

  • What is the difference between flatten and flatten! (destructive flatten)?
  • A more general question, why is it called destructive?
4

2 回答 2

9

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

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

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

这是一个使用sortand的示例sort!

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]
于 2013-05-22T03:16:45.350 回答
1

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

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.

于 2013-05-22T04:45:10.333 回答