Расширить множество стандартных методов до нового пользовательского типа вектора
Я строю новый тип вектора:
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