Julia中如何定义包含输入属性和计算属性的struct结构体
Julia结构体自定义计算属性实现方案
你遇到的报错是因为Julia的结构体定义块内仅支持声明属性的名称和类型,不能直接编写赋值表达式初始化计算属性,这部分逻辑需要放到构造方法中实现,以下是两种常用的实现方案:
方案1:预存计算属性到结构体(适合频繁访问计算属性的场景)
通过内部构造方法,在创建结构体实例时自动计算k并存储为属性,代码实现如下:
struct Bar # 输入传入的属性 E::Float64 A::Float64 L::Float64 # 计算得到的属性 k::Matrix{Float64} # 内部构造方法,仅需传入E、A、L三个参数,自动完成k的计算 function Bar(E::Float64, A::Float64, L::Float64) k = (E * A / L) * [1.0 -1.0; -1.0 1.0] new(E, A, L, k) end end
使用时直接调用Bar(2e5, 0.02, 3.0)即可得到完整的实例,实例的四个属性都可以直接访问。如果需要支持整数等其他数值类型输入,可以使用参数化结构体优化兼容性:
struct Bar{T<:Real} E::T A::T L::T k::Matrix{T} function Bar(E::T, A::T, L::T) where T<:Real k = (E * A / L) * [1 -1; -1 1] new{T}(E, A, L, k) end end # 外部构造方法,支持不同输入类型自动转换为统一类型 Bar(E::Real, A::Real, L::Real) = Bar(promote(E, A, L)...)
如果后续需要修改实例的属性值,只需要在struct前添加mutable关键字定义为可变结构体即可,构造逻辑不需要改动。
方案2:动态计算属性(适合不频繁访问计算属性、需要节省内存的场景)
如果不需要将k存储到结构体中,仅在访问时动态计算,可以重载getproperty方法实现:
struct Bar E::Float64 A::Float64 L::Float64 end # 重载属性访问逻辑,访问.k时自动计算返回 function Base.getproperty(b::Bar, prop::Symbol) if prop == :k E = getfield(b, :E) A = getfield(b, :A) L = getfield(b, :L) return (E*A/L)*[1.0 -1.0; -1.0 1.0] else return getfield(b, prop) end end
这种实现下结构体仅存储三个输入属性,内存占用更低,但每次访问实例.k都会触发一次计算,适合计算量小、访问频率低的场景。
内容的提问来源于stack exchange,提问作者Tommy Blankinship
相关产品推荐
相关产品推荐

