我知道Ruby有很多方法,特别是在数组或类似对象的数组上,例如sort
或flatten
。但是,这些方法还有一个双胞胎(带有感叹号的方式),如sort!
和flatten!
。
现在我的问题是:
flatten
和flatten!
之间有什么区别(破坏性展平)?答案 0 :(得分:7)
不同之处仅在于flatten
返回数组的副本(一个展平的新数组),flatten!
进行“就地”修改或“破坏性修改”。破坏性一词意味着它修改了原始数组。当您知道最终结果是什么时,这非常有用,并且不介意原始结构是否发生变化。
正如@padde指出的那样,它会消耗更少的内存来破坏性地执行某些操作,因为结构可能很大并且复制会很昂贵。
但是,如果您想保留原始结构,最好使用该方法并制作副本。
以下是使用sort
和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]
答案 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
。