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.
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.
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