假设我有一个定义的函数foo.m.此函数可以采用thing类型的参数struct.一旦foo进行了更改thing,我想"锁定",thing以便它不能再被更改.我基本上想让它保持不变.我想这样做是为了确保它不会被进一步修改.我如何在Matlab中执行此操作?
你应该
persistentmlock.mlock将当前运行的函数锁定在内存中,以便后续clear函数不会将其删除.在内存中锁定函数还可以防止文件中定义的任何持久变量重新初始化.
解决方案 1:如果您事先不知道结构体的形式,那么很好
您可以使用匿名函数句柄“捕获”该变量,并且从现在开始仅使用该句柄引用您的结构。匿名函数句柄捕获工作区创建时的状态。您将能够像访问原始结构一样访问它的元素,但如果您尝试分配给它,则会生成错误。
例如
>> 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
Run Code Online (Sandbox Code Playgroud)
它的语法几乎相同,除了您必须使用 来调用它的烦恼之外()。我在这里的终端上使用了它,但显然它也可以轻松地在函数上下文中使用。
小警告;如果您重新定义并覆盖匿名函数,显然,这会适得其反,因为它将继承重新定义时它可以访问的任何新工作空间。
解决方案 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
Run Code Online (Sandbox Code Playgroud)
然后在你的主代码中:
>> 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'.
Run Code Online (Sandbox Code Playgroud)