如何创建可变参数结构?
类似元组或多维数组,构造出含有可变个字段的结构
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容器原理相似,可以去看看