Lua中的函数可以在调用之间存储本地值吗?

时间:2015-04-30 08:11:58

标签: lua closures

我正在阅读“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(),因为1i的开头被初始化为零。但它看起来像行

newCounter()
local i = 0 的来电中跳过

。并且c1()表现得像对象而不是函数。我对Scheme和C#了解不多,所以我熟悉一流的功能。函数返回函数对我来说没问题,但它如何在调用之间存储newCounter()的值?

2 个答案:

答案 0 :(得分:6)

这是"正常"之间的差异。功能和关闭

对于匿名函数,i不是局部变量,它也不是全局变量。它被称为非局部变量。请注意,执行匿名函数时i超出范围:

print(c1()) --> 1
print(c1()) --> 2

这里的要点是,i的值存储在匿名函数中。函数和所有非局部变量一起构成一个闭包。

答案 1 :(得分:0)

您可以将i视为仅C1可见的全局变量。