You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:30:47