I would code the initial example repeated below
var x::Vector
var y::(Vector,Matrix)
x=eig(A) # Computes only eigenvalues
y=eig(A) # Computes both eigenvalues and eigenvectors
as this:
function eig!(A, x :: Vector)
...
end
function eig!(A, x :: Vector, z :: Matrix)
...
end
x = Vector(undef, size1)
z = Matrix(undef, size1, size2)
eig!(A, x) # Computes only eigenvalues
eig!(A, x, z) # Computes both eigenvalues and eigenvectors
Not sure why those output types would be necessary unless it is for returning immutable structs, and in such case you can either dispatch on RefValue
wrappers or just change the function name as it was said.