如何在MATLAB类中重载subasgn实现多级字段赋值?
MATLAB类重载
subasgn实现多级键赋值 需求背景
需要为自定义MATLAB类(如jdict)重载subasgn运算符,实现类似MATLAB结构体的多级键赋值操作:
obj.('elem1').('subsubelem1').('subsubelem1') = val;
标准结构体原生支持该操作,但containers.Map或dictionary不具备此能力;现有公开示例仅覆盖单级子字段赋值,自定义的jdict类已通过重载subsref实现了多级键读取,但原subasgn方法仅支持单级修改。
实现方案(基于递归逻辑)
通过递归拆解多级索引的方式,实现任意层级的键赋值及动态新增层级功能,核心subasgn重载代码如下:
function obj = subasgn(obj, s, val) if length(s) == 1 % 单级赋值:根据类的存储机制处理,示例假设用obj.data存储键值对 if ~isfield(obj.data, s.subs{1}) % 动态新增层级,若键不存在则初始化新的jdict实例(按需调整) obj.data.(s.subs{1}) = jdict(); end obj.data.(s.subs{1}) = val; else % 递归处理多级赋值:先获取当前层级的子对象 current_subobj = subsref(obj, s(1)); % 递归调用subasgn处理剩余层级的赋值 current_subobj = subasgn(current_subobj, s(2:end), val); % 将修改后的子对象写回原实例 obj = subasgn(obj, s(1), current_subobj); end end
关键说明
- 递归逻辑:将多级索引拆解为单级索引的递归调用,逐步定位到目标层级完成赋值
- 依赖基础:需确保自定义类的
subsref方法已实现多级键读取,为递归提供正确的子对象 - 动态新增:单级赋值逻辑中加入了键不存在时的初始化逻辑,支持自动创建新的层级节点
内容的提问来源于stack exchange,提问作者FangQ
相关产品推荐
相关产品推荐

