Расширить множество стандартных методов до нового пользовательского типа вектора

Я строю новый тип вектора:

type MyType
    x::Vector{Float64}
end

Я хочу расширить множество стандартных методов, например, сложение, вычитание, поэлементное сравнение и т. Д. Для моего нового типа. Нужно ли определять определение метода для каждого из них, например:

+(a::MyType, b::MyType) = a.x + b.x
-(a::MyType, b::MyType) = a.x - b.x
.<(a::MyType, b::MyType) = a.x .< b.x

или есть какой-то синтаксический ярлык, который я могу использовать здесь?

2 ответа

Решение

Вот пример использования метапрограммирования Джулии:

for op in (:+, :-, :.<)
    @eval ($op)(a::MyType, b::MyType) = ($op)(a.x, b.x)
end

Вы можете унаследовать от AbstractArray и определите очень маленький интерфейс, чтобы получить все основные операции с массивами бесплатно:

type MyType <: AbstractVector{Float64}
    x::Vector{Float64}
end
Base.linearindexing(::Type{MyType}) = Base.LinearFast()
Base.size(m::MyType) = size(m.x)
Base.getindex(m::MyType,i::Int) = m.x[i]
Base.setindex!(m::MyType,v::Float64,i::Int) = m.x[i] = v
Base.similar(m::MyType, dims::Tuple{Int}) = MyType(Vector{Float64}(dims[1]))

Давайте проверим это:

julia> MyType([1,2,3]) + MyType([3,2,1])
3-element Array{Float64,1}:
 4.0
 4.0
 4.0

julia> MyType([1,2,3]) - MyType([3,2,1])
3-element Array{Float64,1}:
 -2.0
  0.0
  2.0

julia> MyType([1,2,3]) .< MyType([3,2,1])
3-element BitArray{1}:
  true
 false
 false
Другие вопросы по тегам