如何创建可变参数结构?

如何创建可变参数结构?
类似元组或多维数组,构造出含有可变个字段的结构

julia> dump((2, 3, 4, 5))
NTuple{4, Int64}
  1: Int64 2
  2: Int64 3
  3: Int64 4
  4: Int64 5

输入5个参数:

julia> dump((2, 3, 4, 5, 6))
NTuple{5, Int64}
  1: Int64 2
  2: Int64 3
  3: Int64 4
  4: Int64 5
  5: Int64 6
struct MyStruct{T<:Tuple}
    k::T
end

function MyStruct(a...)
    return MyStruct(a)
end
Base.getindex(t::MyStruct, index::Int) = (t.k)[index]

这个应该可以实现在创建时候的长度可变预先格式化的文本

对于实用来说已经足够了,谢谢!
但是这样产生的是一个某成员字段为Tuple的结构,这个结构自身的字段数没有改变。
像元组这样成员字段数可变的结构是怎么实现的呢?

不知道字典能不能满足你的需求
https://docs.julialang.org/en/v1/base/collections/#Dictionaries

julia> Dict([("A", 1), ("B", 2)])
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

构造出含有可变个字段的结构

如果“字段”指的是field,理论上是无法严格满足要求的

像元组这样成员字段数可变的结构是怎么实现的呢?

注意到元组通过getindex访问,可以理解为类似Vector的结构

不知道字典能不能满足你的需求

字典(或许)是一个常见的解决方案;建议把String改成Symbol

P.S. a.b调用getproperty,它可以被重载

julia> struct Item
           id::Int
           extra::Dict{Symbol,Any}
       end

julia> function Base.getproperty(t::Item,k::Symbol)
            return k==:id ? getfield(t,:id) : getfield(t,:extra)[k]
       end

julia> it=Item(3,Dict(:a=>0))
Item(3, Dict{Symbol, Any}(:a => 0))

julia> it.a
0
1 个赞

Tuple像Vector的话,那Vector存储可变个数据的方式又是什么?
对于Array类型,其储存可变个数据的方式是“根据维数和阶数自动地生成一个对应的结构”吗?

julia> dump([1,2,3,4])
Array{Int64}((4,)) [1, 2, 3, 4]

在boot.jl里找了一下,它们被标记为不透明(opaque),即源代码不放在.jl文件中


以下是我的猜测:
由于元素较少且通常顺序访问,Tuple可能是通过链表实现的;
由于元素较多,Array可能是通过块状链表实现的
相关功能可以使用Libc.malloc,free

vector存储可变个数据我觉得应该和c++中的vector容器原理相似,可以去看看

不清楚,Tuple并没有源码,而是封装好的接口