假设我在foo.m
中定义了一个函数。此函数可以采用类型thing
的参数struct
。在foo
对thing
进行更改后,我想"锁定" thing
以便无法再更改。我基本上想让它保持不变。我想这样做是为了确保它不会被进一步修改。我如何在Matlab中做到这一点?
答案 0 :(得分:5)
你应该
persistent
mlock
将您的功能锁定在内存中。 mlock
将当前正在运行的函数锁定在内存中,以便后续的clear
函数不会将其删除。锁定内存中的函数还可以防止文件中定义的任何持久变量重新初始化。
答案 1 :(得分:4)
解决方案1:如果您事先不知道结构将采用何种形式,那就很好
您可以使用匿名函数句柄“捕获”该变量,并且仅从现在开始使用它来引用您的结构。匿名函数句柄在创建时捕获工作空间的状态。您将能够像访问原始结构一样访问其元素,但如果您尝试分配它,则会生成错误。
E.g。
>> S_.a = 1;
>> S_.b = 2;
>> S = @() S_;
>> S_.a = 3;
>> S_
S_ =
scalar structure containing the fields:
a = 3
b = 2
>> S()
ans =
scalar structure containing the fields:
a = 1
b = 2
它的语法几乎相同,除了你必须用()
调用它的烦恼。
我在终端上使用它,但很明显它也可以很容易地用在函数的上下文中。
小警告;如果你重新定义并覆盖匿名函数,很明显,这会引起反击,因为它将继承重新定义时它可以访问的任何新工作空间。
解决方案2:如果您事先知道结构的形式,那就太好了:
假设您事先知道您的结构只包含字段a
和b
。创建一个具有相同属性限制“SetAccess”的类,例如
classdef ConstStruct
properties (GetAccess = 'public', SetAccess = 'private')
a
b
end
methods
%constructor
function obj = ConstStruct(S)
obj.a = S.a;
obj.b = S.b;
end
end
end
然后在你的主要代码中:
>> MyStruct = struct('a',1,'b',2)
MyStruct =
a: 1
b: 2
>> MyStruct = ConstStruct(MyStruct)
MyStruct =
ConstStruct with properties:
a: 1
b: 2
>> MyStruct.a
ans =
1
>> MyStruct.a = 2
You cannot set the read-only property 'a' of 'ConstStruct'.