#clone 和 #dup 有什么区别
What's the difference between #clone and #dup
所以我一直在没有 ruby 背景的情况下学习 crystal 并注意到 api 文档有 #dup
和 #clone
用于基本复制数组.
两者到底有什么区别? api 表示 #dup
浅拷贝数组,而 #clone
深拷贝所述数组。我不确定这到底意味着什么,我应该使用哪一个。
#dup
将复制内存中的数组,即它包含的项目列表,但不会复制项目本身。改变新数组不会影响前一个数组(例如 push
、pop
)但改变它的任何项目都会影响前一个数组的项目,因为这些项目是相同的对象。
#clone
将通过递归调用 #clone
来复制内存中的数组列表及其项目。这是原始阵列的完整克隆。改变任何东西,即使是深层嵌套的对象,也不会影响原始内容。
请注意,这适用于任何对象,而不仅仅是数组,并且可以通过重写您自己的对象中的方法来自定义行为。
也就是说,它仅适用于对象数组(例如 class 实例)。对于基元数组(整数、浮点数、结构...),项目将与数组列表一起复制 #dup
。
所以我一直在没有 ruby 背景的情况下学习 crystal 并注意到 api 文档有 #dup
和 #clone
用于基本复制数组.
两者到底有什么区别? api 表示 #dup
浅拷贝数组,而 #clone
深拷贝所述数组。我不确定这到底意味着什么,我应该使用哪一个。
#dup
将复制内存中的数组,即它包含的项目列表,但不会复制项目本身。改变新数组不会影响前一个数组(例如 push
、pop
)但改变它的任何项目都会影响前一个数组的项目,因为这些项目是相同的对象。
#clone
将通过递归调用 #clone
来复制内存中的数组列表及其项目。这是原始阵列的完整克隆。改变任何东西,即使是深层嵌套的对象,也不会影响原始内容。
请注意,这适用于任何对象,而不仅仅是数组,并且可以通过重写您自己的对象中的方法来自定义行为。
也就是说,它仅适用于对象数组(例如 class 实例)。对于基元数组(整数、浮点数、结构...),项目将与数组列表一起复制 #dup
。