# Semi-deep copy of array

**URL:** <https://discourse.julialang.org/t/semi-deep-copy-of-array/34135>\
**Category:** General Usage\
**Tags:** question\
**Created:** [February 3, 2020, 9:21pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135 "2020-02-03T21:21:44Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Eben60](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eben60/32/13475_2.png) [@Eben60](https://discourse.julialang.org/u/Eben60)\
**Post date:** [February 3, 2020, 9:21pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/1 "2020-02-03T21:21:44Z")

</div>

I have defined a struct MyType and the corresponding method copy(a::MyType).

Now I would like to have a method to copy an Array of MyType, applying this method to each element of the array. What is the proper Julian way of doing it?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 3, 2020, 9:37pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/2 "2020-02-03T21:37:52Z")

</div>

RecursiveArrayTools.jl `recursivecopy`. Add a dispatch for your `MyType`.

---

<div class="post-metadata">

**Author:** ![Eben60](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eben60/32/13475_2.png) [@Eben60](https://discourse.julialang.org/u/Eben60)\
**Post date:** [February 4, 2020, 7:44pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/3 "2020-02-04T19:44:23Z")

</div>

Your code below:

```julia
function recursivecopy(a)
  deepcopy(a)
end

recursivecopy(a::Union{SVector,SMatrix,SArray,Number}) = copy(a)

function recursivecopy(a::AbstractArray{T,N}) where {T<:Number,N}
  copy(a)
end

function recursivecopy(a::AbstractArray{T,N}) where {T<:AbstractArray,N}
  map(recursivecopy,a)
end

```

Here, none of the _specific_ methods appears to be applicable to MyType.

So I would extend it like this:

```julia
function recursivecopy(a::AbstractArray{T,N}) where {T::MyType,N}
  map(recursivecopy,a)
end

function recursivecopy(a::MyType)
  myspecialcopy(a)
end

```

Is that correct?

Meaning if I don’t have nested arrays I don’t actually call any of your code, but your code shows me how to implement the function.

Thank you!

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 4, 2020, 8:31pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/4 "2020-02-04T20:31:53Z")

</div>

Yup that’s the right way to do it. Or just add a dispatch to `copy` for you type, and it’ll automatically find it when it recurses.

I wanna add this to Base sometime.

---

<div class="post-metadata">

**Author:** ![Eben60](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eben60/32/13475_2.png) [@Eben60](https://discourse.julialang.org/u/Eben60)\
**Post date:** [February 4, 2020, 8:41pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/5 "2020-02-04T20:41:21Z")

</div>

> [@ChrisRackauckas](#):
>
> add a dispatch to `copy` for you type

That’s actually what I have already done, here I put `myspecialcopy(a)` just to show that it’s not the standard `copy`

---

<div class="post-metadata">

**Author:** ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)\
**Post date:** [February 4, 2020, 9:14pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/6 "2020-02-04T21:14:03Z")

</div>

Alternatively, wouldn’t `copy.(a)` work?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 4, 2020, 9:29pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/7 "2020-02-04T21:29:39Z")

</div>

Only if you have one level. FWIW, I want recursive broadcasting too.

---

<div class="post-metadata">

**Author:** ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)\
**Post date:** [February 4, 2020, 9:32pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/8 "2020-02-04T21:32:33Z")

</div>

By the sounds of it OP only has one level

---

<div class="post-metadata">

**Author:** ![Eben60](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eben60/32/13475_2.png) [@Eben60](https://discourse.julialang.org/u/Eben60)\
**Post date:** [February 4, 2020, 9:56pm UTC](https://discourse.julialang.org/t/semi-deep-copy-of-array/34135/9 "2020-02-04T21:56:16Z")

</div>

For what I asked – yes, `copy.(a)` would work. Well, that’s that simple.
