Julia 使用符号作为访问器的正确方法

Julia 使用符号作为访问器的正确方法,julia,Julia,包装矩阵和使用符号访问的正确方法是什么 S = OhlcSeries{Float64}(100) lastClose = S[:close, 0] struct OhlcSeries{T} <: AbstractArray{T,2} data::Matrix{T} function OhlcSeries{T}(length::Int) where T data = Matrix{T}(4, length) new{T}(data)

包装矩阵和使用符号访问的正确方法是什么

S = OhlcSeries{Float64}(100)
lastClose = S[:close, 0]

struct OhlcSeries{T} <: AbstractArray{T,2}
    data::Matrix{T}

    function OhlcSeries{T}(length::Int) where T
        data = Matrix{T}(4, length)
        new{T}(data)
    end
end

# Base.parent(A::OhlcSeries) = A.data
getindex(s::OhlcSeries,sym::Symbol) = getindex(s,Val{sym})
getindex(s::OhlcSeries,::Type{Val{:close}}) = view(s.data, 4, :)

# @inline function getindex(S::InputOhlcSeries, r::Symbol, col::Int)
#     @match r begin
#         :open => S.data[1, col]
#         :high => S.data[2, col]
#         :low  => S.data[3, col]
#         :close  => S.data[4, col]
#         _      => throw(ArgumentError("Expected one of :open, :high, :low, :close"))
#     end
# end

@inline function setindex!(S::InputOhlcSeries, value, r::Symbol, col::Int)
    @match r begin
        :open => S.data[1, col] = value
        :high => S.data[2, col] = value
        :low  => S.data[3, col] = value
        :close  => S.data[4, col] = value
        _      => throw(ArgumentError("Expected one of :open, :high, :low, :close"))
    end
end

@inline Base.getindex(S::OhlcSeries, i::Int, j::Int) = S.data[i, j]
@inline Base.setindex!(S::OhlcSeries, value, i::Int, j::Int) = S.data[i, j] = value
Base.size(S::OhlcSeries) = size(S.data.data)
Base.eltype(::Type{OhlcSeries{T}}) where {T} = T
Base.IndexStyle(::Type{<:OhlcSeries}) = IndexCartesian()
S=OhlcSeries{Float64}(100)
lastClose=S[:close,0]
结构OhlcSeries{T}S.data[1,col]
#:high=>S.data[2,col]
#:低=>S.data[3,col]
#:close=>S.data[4,col]
#_u=>throw(ArgumentError(“应为:打开、高、低、关闭中的一个”))
#结束
#结束
@内联函数setindex!(S::InputOhlcSeries,value,r::Symbol,col::Int)
@比赛开始
:open=>S.data[1,col]=值
:high=>S.data[2,col]=值
:low=>S.data[3,col]=值
:close=>S.data[4,col]=值
_=>抛出(ArgumentError(“预期为:打开,:高,:低,:关闭”))
结束
结束
@内联Base.getindex(S::OhlcSeries,i::Int,j::Int)=S.data[i,j]
@内联Base.setindex!(S::OhlcSeries,value,i::Int,j::Int)=S.data[i,j]=value
Base.size(S::OhlcSeries)=size(S.data.data)
Base.eltype(::Type{OhlcSeries{T}}),其中{T}=T

Base.IndexStyle(::Type{如果您希望您的类型是
AbstratArray
的子类型,您应该最少实现API规范中指定的方法。特别是您应该决定
IndexStyle
(查看您的结构
IndexLinear
应该是有效的)

然后,您可以在上面添加自定义索引。如何做到这一点的示例最好在包或中查找。我建议您参考源代码,因为代码可能会变得棘手,因此最好全面检查它们

如果您不希望允许按数字而仅按符号对数据结构的列进行索引,那么这也是完全可行的,但这种类型将不支持
AbstractArray
API,因此如果您将其传递给假定满足此API的标准库函数,则可能会出现错误