如何清除子函数中的持久变量
Posted
技术标签:
【中文标题】如何清除子函数中的持久变量【英文标题】:How to clear persistent variables in sub-functions 【发布时间】:2015-09-09 07:46:34 【问题描述】:我有一个调用函数的脚本,该函数写在单独的文件中,并且包含仅在主函数内部的子函数。在我的一个子功能中,我有一个持久变量,每次运行主脚本时我都想清除它。我该怎么做?此外,我的代码中有断点,我希望在清除持久变量时保留它们 - 怎么做?
MainScript.m 脚本:
clear variables;
for iterNum=1:5
dataOut = MyMainFunction(iterNum);
end
disp(dataOut);
MyMain函数代码:
function dataOut = MyMainFunction(iterNum)
if (iterNum==1)
clear MySubFunction;
end
dataOut = MySubFunction();
end
function dataOut = MySubFunction()
persistent idx;
if isempty(idx)
idx=1;
end
dataOut=idx;
idx=idx+1;
end
我想在每次运行 MainScript.m 时清除“idx”持久变量,但当然要在脚本运行期间保留该变量。
谢谢,约翰
【问题讨论】:
【参考方案1】:我看到的最简单的方法是在函数名后面调用clear
:
clear MySubFunction
而不是
clear variables;
这应该清除该特定函数中的所有持久变量。这可能会产生删除存储的 JIT 副本的副作用,导致它在下次调用时被重新解析。
如果您之前 mlock
'ed 函数,则可以使用 munlock
。
或
您可以在函数中定义一组特殊的参数,这些参数旨在单独清除持久变量,并在主文件的开头使用此语法调用函数。
【讨论】:
我会使用第二个选项 - 在参数列表中添加一个 init 标志,在该标志下清除持久变量,然后函数退出。 @Naveh:嗯,我已经按照你的建议做了,但是这些解决方案有两个问题:1)我不能在 MainScript.m 中调用“Clear MySubFunction”,因为脚本不知道它,但是只有 MyMainFunction 是已知的。 2)我尝试按照您的建议在参数列表中使用一些特殊的初始化标志在 MyMainFunction 中调用“Clear MySubFunction”,但问题是它仍然不起作用,并且持久变量仍然没有重置。 @J.Smith,将您的持久化idx
设为MyMainFunction
的变量,并将MySubFunction
设为nested 的MyMainFunction
函数。这样idx
将在两个函数之间共享,当您在脚本开头调用clear MyMainFunction
时,idx
将被清除。
@Hoki,我知道我可以使用嵌套函数,但为了可读性和舒适性,我更喜欢使用本地函数。我通常尽量避免嵌套函数。
@JSmith 嵌套函数是一个很棒的工具。它们和子函数一样可读,你绝对不应该剥夺自己使用语言提供的所有功能。一旦你使用它,你就会意识到它是多么的舒适。我的建议:敞开心扉去吧!【参考方案2】:
不幸的是,另一个答案部分不正确 - 不可能使用 clear MySubFunction
清除子函数中的持久变量。
引用an answer by a MathWorks staff member,
只能清除***或主要功能(与文件同名)。要清除任何本地或嵌套函数,必须清除 main 函数,并且在 main 函数(或文件中的任何其他函数)运行时不能这样做。
和
只能从内存中清除整个 m 个文件。整个文件作为一个单元进行管理,所以不清除主功能就无法清除子功能。
因此,您的选择是
将子函数分离到自己的m文件中,或者 从MainScript.m
中清除整个MyMainFunction
,或
遵循 Ratbert 的第二个建议,即不要使用 clear
,而是给 MySubFunction
一个额外的参数,告诉它自己重置持久变量
【讨论】:
以上是关于如何清除子函数中的持久变量的主要内容,如果未能解决你的问题,请参考以下文章