rad*_*ead 6 oop matlab struct this anonymous-function
我将一组匿名函数分组到一个结构中,并将该结构中的一些变量分组.有没有办法引用"自我",即自己的结构?我想要完成的是让函数根据成员变量返回一些值.为简单起见,说我有struct
一个,在哪里
a.value_1 = 3;
a.value_2 = 2;
a.sum = @()(self.value_1 + self.value_2)
Run Code Online (Sandbox Code Playgroud)
在MATLAB中有类似的东西吗?
Amr*_*mro 10
之前反对,面向对象编程在MATLAB(包括引入classdef
风格和过时的@ -directory样式类),一个可以创建一个使用闭包和嵌套函数(缺少当然继承)轻量级的对象.这个概念也存在于其他语言中.
这是一个例子:
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
Run Code Online (Sandbox Code Playgroud)
用作:
>> 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
Run Code Online (Sandbox Code Playgroud)
请注意,在创建闭包时会立即捕获变量(如果愿意,函数会有自己的私有副本).因此,如果从返回的结构中更改其中一个公开字段,则不会将其反映在封闭状态中(将它们视为只读属性).
一种解决方案是提供访问方法:
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
Run Code Online (Sandbox Code Playgroud)
所以现在我们可以说:
>> 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
Run Code Online (Sandbox Code Playgroud)
这开始看起来像当前推荐的创建类的方法:
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
Run Code Online (Sandbox Code Playgroud)
以类似的方式使用:
>> s = mystruct()
s =
mystruct with properties:
value_1: 3
value_2: 2
>> s.value_1 = 10;
>> s.sum
ans =
12
Run Code Online (Sandbox Code Playgroud)
我们也可以像以前一样定义get/set 访问方法.
归档时间: |
|
查看次数: |
795 次 |
最近记录: |