In geometry, a two-dimensional point and a vector are not the same, even if they both have an x
and y
component. In Julia, we can also define them as different types, as follows:
# see the code in Chapter 6\unions.jl mutable struct Point x::Float64 y::Float64 end mutable struct Vector2D x::Float64 y::Float64 end
Here are the two objects:
p = Point(2, 5)
that returnsPoint(2.0, 5.0)
v = Vector2D(3, 2)
that returnsVector2D(3.0, 2.0)
Suppose we want to define the sum for these types as a point which has coordinates as the sum of the corresponding coordinates:
+(p, v)
This results in an ERROR: MethodError: `+` has no method matching +(::Point, ::Vector2D)
error message.
To define a +
method here, first do an import Base.+
Even after defining the following, +(p, v)
still returns the same error because of multiple dispatch. Julia has no way of knowing that +(p,v)
should be the same as +(v,p)
:
+(p::Point, q::Point) = Point(p.x + q.x, p.y + q.y) +(u::Vector2D, v::Vector2D)...