Implement AbstractArray so that custom type is returned

I’d like to implement a 3-D vector type like the following:

struct Vector3D
    x::Int
    y::Int
    z::Int
end

Julia has a rich collection of Array operations already defined that I’d love to take advantage of, so I’ll make my Vector a subtype of AbstractVector{Int}

struct Vector3D <: AbstractVector{Int}
    x::Int
    y::Int
    z::Int
end

Base.size(::Vector3D) = (3,)
Base.getindex(v::Vector3D, i::Integer) = i == 1 ? v.x : i == 2 ? v.y : v.z

But when I perform the following operation, an Array type is returned rather than my Vector3D type.

julia> typeof(Vector3D(1, 2, 3) .+ 4)
Array{Int64,1}

What do I need to do so that Vector3D(1, 2, 3) .+ 4 returns a Vector3D type instead?

You need to implement the broadcast interface for Vector3D. I always find that interface to be a bit of a pain, and the most reliable way is to start with the ArrayAndChar example and modify it one step at a time.

Good luck!

Unless you are doing this for your own education you should check out StaticArrays.jl, where all of this is already implemented.

To expand on the StaticArrays suggestion, here is an example:

julia> using StaticArrays

julia> struct Vector3D <: FieldVector{3,Int}
       x :: Int
       y :: Int
       z :: Int
       end

julia> Vector3D(1,2,3)
3-element Vector3D with indices SOneTo(3):
 1
 2
 3

julia> Vector3D(1,2,3) .+ 1
3-element Vector3D with indices SOneTo(3):
 2
 3
 4