是否有一个';自我';在MATLAB中引用自己的结构?

是否有一个';自我';在MATLAB中引用自己的结构?,matlab,oop,struct,this,anonymous-function,Matlab,Oop,Struct,This,Anonymous Function,我将一组匿名函数分组到一个结构和该结构中的一些变量中。是否有一种方法可以引用“自我”,即自己的结构?我想完成的是让函数根据成员变量返回一些值。为简单起见,假设我有一个structa,其中 a.value_1 = 3; a.value_2 = 2; a.sum = @()(self.value_1 + self.value_2) MATLAB中有类似的功能吗?这似乎可行,但我认为您应该创建一个类,而不是结构来实现这一点: a.value_1 = 3; a.value_2 = 2; a.sum

我将一组匿名函数分组到一个结构和该结构中的一些变量中。是否有一种方法可以引用“自我”,即自己的结构?我想完成的是让函数根据成员变量返回一些值。为简单起见,假设我有一个
struct
a,其中

a.value_1 = 3;
a.value_2 = 2;
a.sum = @()(self.value_1 + self.value_2)

MATLAB中有类似的功能吗?

这似乎可行,但我认为您应该创建一个
类,而不是
结构来实现这一点:

a.value_1 = 3;
a.value_2 = 2;

a.sum = @(x)(x.value_1 + x.value_2)

a.sum(a)
有了这个变化

a.value_1 = 3;
a.value_2 = 2;
a.sum = @()(a.value_1 + a.value_2)
然后
a.sum()
返回
5
。但是,当您稍后更改其中一个值时会发生什么情况,例如,设置
a.value_1=5
?现在
a.sum()
返回。。。仍然
5
。传入匿名函数的参数在实例化时进行计算。如果希望第二种行为正常工作,则需要使用。更多信息,请参阅。使用函数句柄的唯一原因是避免在需要之前计算和存储函数的大量输出。

在MATLAB中引入函数句柄之前(包括和样式类),可以使用闭包和嵌套函数创建轻量级对象(当然没有继承性)。这一概念也存在于其他语言中

以下是一个例子:

function s = mystruct()
    s = struct('value_1',[], 'value_2',2, 'sum',@mysum);
    s.value_1 = 3;

    function out = mysum()
        out = s.value_1 + s.value_2;
    end
end
用作:

>> s = mystruct()
s = 
    value_1: 3
    value_2: 2
        sum: @mystruct/mysum
>> s.value_1 = 10;     % NOTE: this wont do what you expect!
>> s.sum()
ans =
     5
请注意,创建闭包时会立即捕获变量(如果愿意,函数会有自己的私有副本)。因此,如果更改返回结构中的一个公开字段,它将不会反映在封闭状态中(将其视为只读属性)

一种解决方案是提供访问器方法:

function obj = mystruct()
    % think of those as private properties
    value_1 = 3;
    value_2 = 2;

    % returned object (this or self)
    obj = struct();

    % public accessors for properties
    obj.value_1 = @accessValue1;
    function out = accessValue1(in)
        if nargin > 0, value_1 = in; end
        out = value_1;
    end
    obj.value_2 = @accessValue2;
    function out = accessValue2(in)
        if nargin > 0, value_2 = in; end
        out = value_2;
    end

    % member method
    obj.sum = @mysum;
    function out = mysum()
        out = value_1 + value_2;
    end
end
现在我们可以说:

>> s = mystruct()
s = 
    value_1: @mystruct/accessValue1
    value_2: @mystruct/accessValue1
        sum: @mystruct/mysum
>> x = s.value_1();   % get
>> s.value_1(10);     % set
>> s.sum()
ans =
    12
这看起来开始像当前推荐的创建类的方法:

classdef mystruct < handle
    properties
        value_1 = 3;
        value_2 = 2;
    end
    methods
        function out = sum(obj)
            out = obj.value_1 + obj.value_2;
        end
    end
end

我们还可以像以前一样定义get/set..

您是否更愿意使用类而不是struct来完成此操作?感谢您的快速回复和评论。现在,我意识到有一种方法可以在MATLAB中定义一个类。我们将添加相同的精确答案!这只适用于一个非常特定的用例——如果一个人不理解它在做什么,它会在其他用例中出现。@horchler在什么情况下它会出错?这确实有效,我确实建议使用一个类,这样我就不会真正理解downovte了?你是正确的-你的
sum
函数与OP和我使用的函数不同,现在我看到你将
a
x
)作为参数传递。这是我提议的一种形式。谢谢你的回复。我一直在寻找一个类,但没有意识到它在MATLAB中是可用的。谢谢你的详细解释。
>> s = mystruct()
s = 
  mystruct with properties:

    value_1: 3
    value_2: 2
>> s.value_1 = 10;
>> s.sum
ans =
    12