如何将侦听器设置为 MATLAB 对象的结构字段

How to set listener to a MATLAB object's structure's field

我有一个类似于以下内容的 MATLAB 对象:

classdef myObj < handle

properties (SetObservable)
    % NOTE: we want this to be a struct, as written, its not
    myStruct
end

methods
    function self = myObj(fieldVal)
        self.myStruct = fieldVal;
        % WANT: self.myStruct.myField = fieldVal;

        %  add listener to update if change to self.myStruct
        % WANT: add listener to update if change to
        % self.myStruct.myField
        addlistener(self, 'myStruct', 'PostSet', @self.callbackFnc);
    end

    function callbackFnc(self, varargin)
        fprintf(['self.myStruct is now ', num2str(self.myStruct), '\n'])
    end

end

end

它有一个 属性 实例的侦听器(乐观地命名为 myStruct)。这给出:

>> tempObj = myObj(3);
>> tempObj.myStruct = 4;
self.myStruct is now 4

如何将侦听器设置为 self.myStruct 的字段而不是 self.myStruct 本身?

你不能直接做你想做的事。您只能将侦听器附加到 属性 本身,而不是 属性 的字段(如果 属性 是结构)。

我会尝试做一些稍微不同的事情,使用 myStruct 属性 的 set 函数来检测正在设置哪个字段,然后触发常规事件而不是属性 事件:

classdef myObj2 < handle

properties
    myStruct = struct('myField', []);
end

events
    myFieldChanged
end

methods
    function self = myObj2(fieldVal)
        self.myStruct.myField = fieldVal;
        addlistener(self, 'myFieldChanged', @self.callbackFnc);
    end

    function set.myStruct(obj, val)
        oldProp = obj.myStruct;
        obj.myStruct = val;
        if obj.myStruct.myField ~= oldProp.myField
            notify(obj,'myFieldChanged')
        end
    end

    function callbackFnc(self, varargin)
        fprintf(['self.myStruct.myField is now ', num2str(self.myStruct.myField), '\n'])
    end

end

end

希望建议对您有所帮助!