gpt4 book ai didi

matlab - 在 MATLAB 中是否有 'self' 来引用自己的结构?

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:51 25 4
gpt4 key购买 nike

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

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

MATLAB 中有类似的东西吗?

最佳答案

之前objected-oriented programming在 MATLAB 中引入(包括 classdef-styleobsolete @-directory 样式类),一个 could使用闭包和嵌套函数创建轻量级对象(当然缺少继承)。这个概念也存在于其他语言中。

这是一个例子:

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

请注意,创建闭包时会立即捕获变量(如果您愿意,函数有自己的私有(private)副本)。因此,如果您更改返回结构中的公开字段之一,它不会反射(reflect)在封闭状态中(将它们视为只读属性)。

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

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

以类似的方式使用:

>> s = mystruct()
s =
mystruct with properties:

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

我们还可以定义 get/set access methods和以前一样..

关于matlab - 在 MATLAB 中是否有 'self' 来引用自己的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com