Julia:不可变结构体(immutable struct)的对象可修改范围咨询
理解Julia中不可变结构体的可修改性
你遇到的情况其实是Julia里不可变结构体(默认struct就是不可变的)的典型特性,咱们把这个逻辑拆解清楚:
不可变结构体的核心规则
不可变结构体的实例本身不能被重新赋值——简单说,你不能直接替换结构体字段的整个引用,比如下面这些操作都会报错:
# 试图修改不可变类型字段的整体值,会报错 FltFriction.Dc = 0.2 # 试图把muS换成一个全新的数组,也会报错 FltFriction.muS = repmat([0.7], 100, 1)
但这里有个关键区别:如果字段是可变对象(比如Array、Dict这类容器),你可以修改这个对象内部的内容。因为结构体存的只是指向这个对象的引用,你没有改变引用本身,只是修改了引用指向的内存里的数据。
你的数组元素修改为什么能正常执行
看你写的这行代码:
FltFriction.muS[1:20] = 100
它并没有改变FltFriction.muS这个字段的引用——它还是指向原来那个100x1的数组,你只是修改了这个数组里第1到20个位置的元素值,这完全符合可变对象的修改规则,所以能正常运行。
哪些内容确实不能修改
反过来,以下操作都会触发错误:
- 修改非可变类型的字段值(比如你的
Dc::Float64,Float64本身是不可变类型) - 替换整个数组/字典这类字段为新的对象
- 任何试图改变字段引用指向的操作
额外小提示
如果需要完全锁定所有内容,不让任何部分被修改,你可以考虑用const修饰结构体实例,或者使用StaticArrays.jl里的静态数组(这类数组本身是不可变的,连内部元素都无法修改)。
内容的提问来源于stack exchange,提问作者Prithvi Thakur
相关产品推荐
相关产品推荐

