gpt4 book ai didi

julia - julia struct 可以定义为对字段维度有持久的要求吗?

转载 作者:行者123 更新时间:2023-12-05 02:37:50 25 4
gpt4 key购买 nike

如果我将一个新结构定义为

mutable struct myStruct
data::AbstractMatrix
labels::Vector{String}
end

如果 labels 的长度不等于 data 的列数,我想抛出一个错误,我知道我可以编写一个强制执行的构造函数这种情况就像

myStruct(data, labels) = length(labels) != size(data)[2] ? error("Labels incorrect length") : new(data,labels)

但是,一旦结构被初始化,labels 字段可能被设置为不正确的长度:

m = myStruct(randn(2,2), ["a", "b"])
m.labels = ["a"]

如果 labels 字段设置的长度不等于 data 中的列数,是否有办法抛出错误?

最佳答案

您可以使用 StaticArrays.jl 来固定矩阵和向量的大小,以开始:

using StaticArrays

mutable struct MatVec{R, C, RC, VT, MT}
data::MMatrix{R, C, MT, RC} # RC should be R*C
labels::MVector{C, VT}
end

但是有一个缺点,那就是必须为每个具体类型编译具有唯一排列的类型参数 R,C,MT,VTStaticArrays 的缩放比例也不如普通的Array

如果您不限制类型参数中的维度(有所有这些缺点)并且想在运行时抛出错误,那么您会得到好消息和坏消息。

好消息是您可以控制您的类型发生的任何变化。 m.labels = v 将调用方法 setproperty!(object::myStruct, name::Symbol, v),您可以使用您喜欢的所有安全措施来定义它。

坏消息是您无法控制字段类型的变化。 push!(m.labels, 1)push!(a::Vector{T}, item) 方法中发生变化。 myStruct 实例本身实际上并没有改变;它仍然指向相同的 Vector。如果你不能保证你不会做像 x = m.labels; 这样的事情。 push!(x, "whoops") ,那么你确实需要运行时检查,比如 iscorrect(m::myStruct) = length(m.labels) == size(m.data)[2 ]

关于julia - julia struct 可以定义为对字段维度有持久的要求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69886345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com