So I've been learning crystal without a ruby background and noticed the api docs have #dup and #clone for basically copying an array.
What exactly is the difference between the two? The api says #dup shallow copies the array whilst #clone deep copies said array. I'm not sure what exactly that entails and which one I should be using.
#dupwill duplicate the array in memory, that is the list of items it contains, but it won't duplicate the items themselves. Mutating the new array won't affect the previous array(e.g.push,pop) but mutating any of its items will affect the item of the previous array since the items are the same objects.#clonewill duplicate the array list in memory, but also its items, by calling#clonerecursively. This is a full clone of the original array. Mutating anything, even a deep nested object, won't affect the original content.Note that this applies to any object, not just arrays, and that the behavior can be customised by overriding the methods in your own objects.
That being said, it only applies for arrays of objects (e.g. class instances). For arrays of primitives (integer, float, struct...) the items will be copied along with the array list by
#dup.