Julia中如何为结构体子字段赋值?以替换position字段为例
Julia结构体子字段赋值解决方案
嘿,这问题我熟!你遇到的核心问题其实是搞混了替换整个字段和修改字段内数组元素的操作,另外还要注意Julia里结构体的可变性规则,我一步步给你讲清楚:
第一步:确认结构体的可变性
首先,Julia里默认的struct是不可变的——也就是说一旦创建实例,它的字段就不能被直接修改。如果你想直接修改position字段,得把结构体定义成mutable struct:
# 定义可变结构体,这样才能直接修改字段 mutable struct individual position::Vector{Int} cost::Vector{Any} end
如果你的individual是普通的struct(不可变),那不能直接改字段,得用下面第二种方法。
方法一:可变结构体直接赋值字段
如果用了mutable struct,那直接给position字段赋值新数组就行,这完全符合你的需求:
# 创建pop数组 pop = [individual(rand(0:1,10),[]) for i in 1:2] # 定义要替换的x数组 x = [0, 2, 0, 0, 2, 0, 0, 2, 2, 2] # 直接替换整个position字段,不是追加元素! pop[1].position = x # 查看结果,就是你想要的 println(pop[1]) # 输出:individual([0, 2, 0, 0, 2, 0, 0, 2, 2, 2], Any[])
方法二:不可变结构体创建新实例替换
如果你的individual是不可变的struct(没加mutable),那不能直接修改字段,得创建一个新的individual实例,替换掉pop[1]的位置:
# 定义不可变结构体 struct individual position::Vector{Int} cost::Vector{Any} end pop = [individual(rand(0:1,10),[]) for i in 1:2] x = [0, 2, 0, 0, 2, 0, 0, 2, 2, 2] # 创建新实例,保留原来的cost字段,替换position pop[1] = individual(x, pop[1].cost) println(pop[1]) # 同样得到你想要的结果
为什么append!()不行?
你之前用append!()会变长,是因为append!()的作用是给现有的数组追加元素——比如append!(pop[1].position, x)会把x的元素加到原来的position数组后面,导致长度变成20,这显然不是你要的“替换整个字段”的操作。
内容的提问来源于stack exchange,提问作者Soma
相关产品推荐
相关产品推荐

