Lua 函数定义与使用

2019-05-04 23:45|来源: 网路

Lua 函数

在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。

Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。

Lua 函数主要有两种用途:

  • 1.完成指定的任务,这种情况下函数作为调用语句使用;

  • 2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。


函数定义

Lua 编程语言函数定义格式如下:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
	function_body	return result_params_comma_separatedend


解析:

  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字local

  • function_name:指定函数名称。

  • argument1, argument2, argument3..., argumentn:函数参数,多个参数以逗号隔开,函数也可以不带参数。

  • function_body:函数体,函数中需要执行的代码语句块。

  • result_params_comma_separated:函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

  • 实例

    以下实例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值:

    --[[ 函数返回两个值的最大值 --]]function max(num1, num2)
    
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
    
       return result; end-- 调用函数print("两值比较最大值为 ",max(10,4))print("两值比较最大值为 ",max(5,6))

  • 以上代码执行结果为:

    两值比较最大值为 	10两值比较最大值为 	6

  • Lua 中我们可以将函数作为参数传递给函数,如下实例:

    myprint = function(param)
       print("这是打印函数 -   ##",param,"##")endfunction add(num1,num2,functionPrint)
       result = num1 + num2   -- 调用传递的函数参数
       functionPrint(result)endmyprint(10)-- myprint 函数作为参数传递add(2,5,myprint)

  • 以上代码执行结果为:

    这是打印函数 -   ##	10	##这是打印函数 -   ##	7	##


  • 多返回值

    Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。

    > s, e = string.find("www.runoob.com", "runoob") > print(s, e)5	10

  • Lua函数中,在return后列出要返回的值得列表即可返回多值,如:

    function maximum (a)
        local mi = 1             -- 最大值索引
        local m = a[mi]          -- 最大值
        for i,val in ipairs(a) do
           if val > m then
               mi = i
               m = val       end
        end
        return m, miendprint(maximum({8,10,23,12,5}))

  • 以上代码执行结果为:

    23	3


  • 可变参数

    Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。

    Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。

    例如,我们计算几个数的平均值:

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v   end
       print("总共传入 " .. #arg .. " 个数")
       return result/#argendprint("平均值为",average(10,5,3,4,5,6))

  • 以上代码执行结果为:

    总共传入 6 个数平均值为	5.5

相关问答

更多
  • HTTP请求是指从客户端到服务器端的请求消息。包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议。从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符及使用的协议。HTTP请求信息由3部分组成:l请求方法URI协议/版本l请求头(RequestHeader)l请求正文HTTP响应HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:l 状态行l 响应头(ResponseHeader)l 响应正文在接收和解释请求消息后,服务器会返回一个HTTP响应消息。状态行 ...
  • 从metatables文档 : 元表可以控制对象在算术运算,命令比较,连接,长度操作和索引中的表现。 metatable还可以定义在用户数据被垃圾收集时调用的函数。 Lua用户的Lua FAQ指出: 为什么__gc和__len元方法不能在表格上工作? 用户数据对象通常需要一些显式的析构函数来在对象即将被删除时运行,而Lua为此提供了__gc元方法。 但是,为了提高效率,这在表格中是不允许的。 通常,不需要在表上设置析构函数,因为表将自动删除,并且表中包含的任何引用都将被正常地垃圾收集。 可能的解决方法是创建 ...
  • “Lua编程”第8页 在脚本的主体中,表达式“...”导致脚本的参数。 所以a和ns应该接收WOW传入的前两个参数。 Page 8 of "Programming in Lua" In the main body of a script, the expression "..." results in the arguments to the script. So a and ns should receive the first two arguments passed in by WOW.
  • 正如评论中已经提到的,C API中none使用任何值来检查是否没有值。 请考虑以下脚本: function foo(arg) print(arg) end foo(nil) --> nil foo() --> nil 在Lua中,您可以使用select('#', ...)来获取传递给foo的参数数量,并且使用C API可以检查用户是否完全不提供参数(使用lua_isnone )。 考虑下面的小C库,它类似于type ,但它可以识别,如果没有给出参数: #include ...
  • Lua 5.3将 lua_pop 定义为 #define lua_pop(L,n) lua_settop(L, -(n)-1) 和lua_settop可以在这里看到; 它将用nil填充堆栈槽,因此值可以是gc'd。 所以它是带有arg 1的O(1)。 您可以读取O(1)中的每个值,并且N值的弹出值是O(N)。 所以,你的两种方法应该大致相同。 Re:读取O(1)中的值,函数index2addr将堆栈偏移量转换为地址。 Lua 5.3 defines lua_pop as #defin ...
  • 正如我对原始问题的评论中所提到的,我在我的C ++应用程序中包含了lua.hpp。 当Lua被编译为C库以来,这很有效,因为lua.hpp undos name mangling: lua.hpp: extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } 正如@EtanReisner所指出的,当使用Lua作为C ++库时,我不需要撤消名称修改。 所以解决方案是简单地包含实际的Lua头,而不是lua.hpp // U ...
  • 重要通知:请参阅下面的Josiah的回答。 我的回答结果证明是错误的,或者至少是不完整的 。 这让我非常高兴,它让Redis变得更加灵活。 我的错误/不完整答案: 我很确定这是不可能的。 您不能使用全局变量(读取文档 ),并且脚本本身由Redis Lua引擎获取本地和临时范围。 如果Lua函数执行任何写操作,它们会在幕后自动设置“写入”标志。 这会启动一个事务。 如果您级联Lua调用,Redis中的簿记将变得非常麻烦,尤其是在Redis从站上执行级联时。 这就是EVAL和EVALSHA故意无法在Lua脚本中 ...
  • 尝试使用luaL_dostring ,它加载并运行给定的字符串。 Try using luaL_dostring, which loads and runs a given string.
  • 通常可以使用SWIG快速(几乎)完全包装复杂的库API。 在这种情况下使用SWIG的一个优点是可以轻松构建基于SWIG的包装器,这些包装器可以使用包括Lua,Perl,Python,Ruby和Java等18种主要语言的库。 如果Lua是您首选(也可能是唯一)的关注点,那么我建议学习使用luaL_register()作为策略的核心来在C中构建Lua模块。以这种方式构建模块的一个优点是您可以保留所有您的函数在单个名称空间中没有任何开销。 您将需要创建一个与Lua C函数调用约定匹配的包装函数(就像您使用lua_ ...
  • 正如Lua要求的man页面所描述的 ,它在路径中搜索文件。 这个路径可以在C中定义。看看这篇文章: “从C ++ / C设置全局LUA_PATH变量” require函数非常实用,可以加载.lua文件中定义的模块和库。 As decribed by the Lua require man page, it searches for the file in a path. This path can be defined in C. Have a look to this post : "Setting th ...