【问题标题】:Declaring Lua Functions and referencing with correct name声明 Lua 函数并使用正确的名称引用
【发布时间】:2011-12-24 21:44:59
【问题描述】:

以下 Lua 脚本在函数范围方面有什么区别。这将如何影响其他 Lua 脚本中对 require 'calculator' 的需求。以及如何在LuaState.getGlobal(function_name) 中引用它。它的正确函数名称是什么?还有任何关于声明方法的优点/缺点的评论。

A) Calculator.lua

function foo(n) 
   return n+1;
end

B) Calculator.lua

calc= {}
function calc.foo(n) 
  return n+1;
end

C) Calculator.lua

function foo(n) 
   return n+1;
end
function calculator()
   calc = {}
   calc.foo=foo
   return calc
end

【问题讨论】:

    标签: lua


    【解决方案1】:

    我不知道这些脚本的“范围”到底是什么意思。这些脚本的确切作用取决于它们的执行方式。你可以给他们一个不同的环境,从而改变他们对“全局”的看法。

    因此,我将根据您使用dofiledostring 或类似名称加载它们的假设来解释每个脚本的作用。也就是说,您将它们应用到全局环境中。

    一)

    这会创建一个全局变量foo,它是一个函数。

    B)

    这会创建一个全局变量calc,它是一个。该表有一个条目,键为foo,其值为函数。

    C)

    这会创建 两个 全局变量。 foo 是一个函数。 calculator 也是一个函数。每次调用calculator 都会导致全局变量calc 被覆盖。 calc 的新值将是一个具有单个条目的表,键为 foo,其值是存储在全局变量 foo 中的内容的副本。

    很难说方法 C 的“优点”是什么,因为它没有任何意义。它创建了两个函数而不是一个,并且第二个函数不断创建新表。

    B 只是 A 的“命名空间”范围版本。 Lua 模块的一般期望是包含它们通常会创建一些包含该模块中所有函数的表,以避免与现有全局状态的名称冲突。在这方面,B 可能会更好。但这主要取决于此脚本的用途。

    就个人而言,对于简单的 shell 脚本和实用程序脚本,我不关心正确的模块范围。当我做一个合适的模块时,我通常使用module Lua 函数。

    【讨论】:

      【解决方案2】:

      不完全是一个答案,而是对语义的评论——在 Lua 中,你不声明一个函数,你创建它。该功能在执行function(...) ... end 时可用。它的可用方式取决于您存储它的位置。

      你必须记住:

      function myfun(foo) print('foo') end
      

      只是语法糖:

      myfun = function(foo) print('foo') end
      

      如果你不做任何特别的事情,myfun 将成为一个全局变量,存储在全局状态中(可通过_G 访问)。如果你在实际调用function myfun() end之前说local myfun,那么函数(实际上是一个closure)将存储在局部变量中,并且只在局部变量的范围内可用。

      如果您使用require,它只会找到文件并加载一次。它对模块没有任何花哨的功能,例如隐藏全局变量等。因此,如果您在模块Calculator.lua 中编写function foo() end,则调用require 'Calculator' 将在全局foo 中创建一个函数,您可以使用LuaState.getGlobal("foo")。如果您创建一个函数表(步骤 B),则必须使用 2 个步骤:

      L.getGlobal("calc")   -- pushes the "calc" global (a table) to the stack
      L.getField(-1, "foo") -- gets the "foo" field from the table 
      

      【讨论】:

        猜你喜欢
        • 2016-01-04
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 2015-03-23
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        相关资源
        最近更新 更多