我正在阅读“Lua编程”,我不理解Lua中这段代码中的函数行为:
public class ScheduledTaskStructure : IDisposable
{
private Timer _timer;
public void Start()
{
_timer = new Timer();
_timer.Interval (new TimeSpan(24,0,0)).TotalMilliseconds;
_timer.AutoReset = false;
_timer.Elapsed += _timer_Elapsed;
}
private Assembly _Assembly;
private object _instance;
private Type _classType;
MethodInfo _MethodInfo;
void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
_timer.Stop();
if (_Assembly == null)
{
_Assembly = Assembly.LoadFrom(ModuleName);
_instance = _Assembly.CreateInstance(ClassName, true);
_classType = _Assembly.GetType(ClassName, true, true);
_MethodInfo = _classType.GetMethod(MethodName);
}
_MethodInfo.Invoke(_instance, null);
_timer.Start();
}
public void Stop()
{
if (_timer != null)
{
_timer.Stop();
_timer = null;
}
}
public volatile bool IsRunning { get; set; }
#region IDisposable Members
public void Dispose()
{
_timer = null;
}
#endregion
public string Task { get; set; }
public DateTime NextRun { get; set; }
public string TimeInterval { get; set; }
public string ModuleName { get; set; }
public string ClassName { get; set; }
public string MethodName { get; set; }
public string Status { get; set; }
public bool IsUsed { get; set; }
}
从我的观点来看,每次通话function newCounter ()
local i = 0
return function () -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
都应该返回c1()
,因为1
在i
的开头被初始化为零。但它看起来像行
newCounter()
在local i = 0
的来电中跳过。并且c1()
表现得像对象而不是函数。我对Scheme和C#了解不多,所以我熟悉一流的功能。函数返回函数对我来说没问题,但它如何在调用之间存储newCounter()
的值?
答案 0 :(得分:6)
这是"正常"之间的差异。功能和关闭。
对于匿名函数,i
不是局部变量,它也不是全局变量。它被称为非局部变量。请注意,执行匿名函数时i
超出范围:
print(c1()) --> 1
print(c1()) --> 2
这里的要点是,i
的值存储在匿名函数中。函数和所有非局部变量一起构成一个闭包。
答案 1 :(得分:0)
您可以将i
视为仅C1
可见的全局变量。