Julia不可变struct如何实现index不可变、Vector类型values字段可赋值
解决方案
你原本的代码报错是因为不可变结构体(struct)的字段绑定不可修改:list.values = new_values的本质是让values字段指向一个新的向量对象,属于修改字段绑定,违反了不可变结构体的约束。
但Vector本身是可变容器,你不需要修改字段绑定,只要修改values指向的原有向量的内容即可满足需求。
最优实现
function set_values!(list::NumberedList, new_values::Vector{Int64}) list.values[:] = new_values end
这个方案的优势完全匹配你的要求:
- 保留
NumberedList为不可变结构体,index字段始终不可修改 - 没有使用逐元素
push!的遍历实现,切片赋值是Julia内置的优化操作,底层直接进行批量内存拷贝,效率远高于逐元素操作 - 自动适配
new_values的长度,不管原有values的长度是多少,都会直接替换为新值的全部内容
如果你希望写法更显式,也可以用resize!加copyto!的实现,效果完全一致:
function set_values!(list::NumberedList, new_values::Vector{Int64}) resize!(list.values, length(new_values)) copyto!(list.values, new_values) end
内容的提问来源于stack exchange,提问作者Alexander L. Hayes
相关产品推荐
相关产品推荐

