Size: a a a

Язык программирования Julia / Julia programming language

2020 January 23

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
struct LVector{T,A <: AbstractVector{T},Syms} <: AbstractVector{T}
   __x::A
   LVector{Syms}(__x) where {T,A,Syms} = new{eltype(__x),typeof(__x),Syms}(__x)
end
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Видимо за счёт того, что их мало, это ок.
И получается, что вместо того, чтобы делать if, и добавлять маппинг имён -> индексы он перекладывает эту работу на компилятор.
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
что за Syms такой )
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
просто имя типа?
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Syms - это тип
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
То есть ты будешь писать что-то вроде
LVector{:x, :y, :z}([1, 2, 3])
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Не совсем так, но как-то близко
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
непонятно, как эта структура зависит от Syms
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
у неё ведь нет полей с Syms
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
А ей и не нужно
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
В этом весь фокус.
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
symnames(::Type{LVector{T,A,Syms}}) where {T,A,Syms} = Syms
function Base.getindex(x::LVector,::Val{s}) where s
   idx = findfirst(y->y==s,symnames(typeof(x)))
   x.__x[idx]
end
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Он её вот в этом месте использует
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
idx = findfirst(y->y==s,symnames(typeof(x)))
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
ну первое понятно — просто вернуть список символьных имён
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
В следующей строчке, когда индекс пишет.
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
а почему тут так написано:
symnames(::Type{LVector{T,A,Syms}}) where {T,A,Syms} = Syms
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
почему не
symnames(x :: LVector{T,A,S}) = S
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Грубо говоря.
Представь, что у тебя есть тупл (1, 1.0). Его тип будет Tuple{Int, Float64}
Соответственно, ты можешь сказать, что вместо обращения по индексу ты будешь обращаться по тому месту, где находится соответствующий тип Int или Float64. Для этого ты вычисляешь, где именно в типе находится Int/Float и производишь вызов соответствующего элемента тупла.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Заменяя встроенные типы Int, Float64, на твои собственные X, Y, ты получишь Named tuple
источник