如何在Julia中像访问非嵌套变量一样访问嵌套结构中的变量?
Julia结构体嵌套实现直接访问嵌套字段
要实现MyB.Var1直接访问嵌套结构体A的Var1字段,你可以通过扩展Julia的Base.getproperty(读取)和Base.setproperty!(修改)方法来实现,具体代码如下:
只读访问实现
mutable struct A Var1::Int64 end mutable struct B StructA::A Var2::Int64 end # 扩展getproperty,处理Var1的访问 function Base.getproperty(obj::B, sym::Symbol) if sym === :Var1 # 用getfield避免递归调用getproperty return getfield(obj, :StructA).Var1 else # 其他字段按默认逻辑处理 return getfield(obj, sym) end end MyA = A(1) MyB = B(MyA, 2) MyB.Var1 # 返回1 MyB.Var2 # 返回2
支持修改字段
如果需要通过MyB.Var1 = new_val修改嵌套字段,还需要扩展setproperty!方法:
function Base.setproperty!(obj::B, sym::Symbol, val) if sym === :Var1 setproperty!(getfield(obj, :StructA), :Var1, val) else setfield!(obj, sym, val) end end MyB.Var1 = 100 MyB.Var1 # 返回100 MyA.Var1 # 由于MyB.StructA是引用类型,MyA的Var1也会变为100
注意事项
- 必须使用
getfield获取结构体的原始字段,不能直接用obj.StructA,否则会递归调用getproperty导致栈溢出。 - 这种方式相当于给结构体
B添加了一个"虚拟字段",对外表现和真实字段一致,但实际是代理到嵌套的A结构体。
内容的提问来源于stack exchange,提问作者Seraphax
相关产品推荐
相关产品推荐

