详见关键字:持久的
已语句的变量持久的在一个函数内,将在对同一函数的后续调用之间将其内容保留在内存中。持久变量和全局变量之间的区别在于,持久变量在特定函数的作用域中是局部的,在其他地方不可见。
下面的示例使用一个持久变量来创建一个函数,该函数打印它被调用的次数。
函数count_calls()持久调用=0;printf(“'count_calls'已被调用%d次\n”,++个调用);endfunctionfor i=1:3 count_calls();endfor-|“count_calls”已被调用1次-|“count_calls“已被调用2次-|”count_calls'已被调用3次
如示例所示,可以使用持久的
语句语句。以下语句都是持久性语句。
持久性开孔a b持久性开闭c=2持久性开开闭d=3 e f=5
持久变量的行为等价于C中静态变量的行为。
持久变量的一个限制是,函数的输入或输出参数都不能是持久的:
函数y=foo()persistent y=0;#不允许!endfunctionfoo()-|error:无法使函数参数y持久化
与全局变量一样,持久变量只能初始化一次。例如,在执行以下代码之后
持久性pvar=1持久性pvar=2
持久变量的值pvar
是1,而不是2。
如果一个持久变量被语句但没有初始化为特定值,它将包含一个空矩阵。因此,也可以通过检查它是否为空来初始化持久变量,如下例所示。
函数count_calls()持久调用;if(isempty(calls))calls=0;endif printf(“'count_calls'已被调用%d次\n”,++个调用);结束函数
此实现的行为方式与的上一个实现完全相同计数(_C)
.
持久变量的值一直保存在内存中,直到它被明确清除为止。假设的实施计数(_C)
保存在磁盘上,我们会得到以下行为。
对于i=1:2 count_calls();endfor-|'count_calls'已被调用1次-|'count_calls''已被调用2次clearfor i=1:2 count_calls();endfor-|'count_calls'已被调用3次-|'count _calls''已被调用4次clear allfor i=1:2 count_calls();endfor-|'count_calls'已被调用1次-|'count _calls'已被调用2次clear count_callsfori=1:2 count_calls();endfor-|“count_calls”已被调用1次-|“count _calls“已被调用2次
也就是说,只有当包含变量的函数被删除时,持久变量才会从内存中删除。请注意,如果函数定义直接输入到Octave提示符中,则persistentvariable将通过简单的清楚的
命令作为entirefunction定义将从内存中删除。如果即使函数已清除,也不希望从内存中删除持久变量,则应使用mlock
函数(详见函数锁定).
版权所有 © 2024 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号