1.函数定义的格式:

Lua使用function定义函数,语法如下:

  function function_name (arc)    --arc表示参数列表,函数的参数列表可以为空

    --body

  end

上面的语法等价于:

  function_name function_name (arc)

    --body

  end_

上面的方法都是定义了一个全局函数,为了不污染命名空间,同时减少性能损耗,我们应该尽量使用“局部函数”,方法如下(只需要再前面加local声明即可):

  local function function_name (arc)    --arc表示参数列表,函数的参数列表可以为空

    --body

  end

注意:Lua函数的本质是变量赋值,所以再使用函数之前,一定要先定义函数(C语言可以再后面定义,前面声明,但是Lua没有声明,只有定义)

  由于函数定义等价于变量赋值,也就可以把函数名替换为Lua某个表的字段,如:

function Foo.bar(a, b,	c)  --此时不能再加local函数声明了
end

 2.函数参数

1)Lua函数的参数大部分是按值传递的。

函数传参的几个规则:

  a、若参数个数大于形参个数,从左向右,多余的实参被忽略

  b、若实参个数小于形参个数,从左向右,没有被初始化的形参被初始化为nil

  c、Lua还支持变长参数。用...表示。此时访问参数也要用...,如:

local function	func(...)	--形参为	...	,表示函数采用变长参数
  local temp = {...}  --访问的时候也要使用 ...
  local ans = table.concat(temp, "") --使用table.concat库函数,对数组内容使用" "拼接成字符串。
print(ans)
end
func(1, 2) --传递了两个参数
func(1, 2, 3, 4) --传递了四个参数
-->output
1 2
1 2 3 4

2)当函数参数是table类型时,传递进来的实际上是实际参数的引用。如具名函数

3.函数的返回值

Lua函数允许返回多个值,返回多个值时,中间用逗号隔开

函数返回值的规则:

  1)若返回值个数大于接收变量的个数,多余的返回值会被忽略掉;

  2)若返回值个数小于参数个数,从左向右,没有被返回值初始化的变量会被初始化为nil

函数返回值与表达式:

  1)当一个函数返回一个以上的返回值,且函数调用不是一个列表表达式的最后一个元素,那么函数只返回第一个返回值,如:

  

local function init()	--init函数返回两个值 1和"lua"
  return 1, "lua"
end
local x, y, z = init(), 2 --init函数的位置不在最后,此时只返回 1
print(x, y, z) -->output 1 2 nil
local a, b, c = 2, init() --init函数的位置在最后,此时返回 1 和 "lua"
print(a, b, c) -->output 2 1 lua

  2)如果你确保只取函数返回值的第一个值,可以使用括号运算符,例如:

  

local function init()
  return 1, "lua"
end
print((init()), 2) -->output 1  2
print(2, (init())) -->output 2 1

  

Lua学习---函数定义的更多相关文章

  1. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

  2. Lua的函数的定义、math数学函数、lua字符串的处理、lua支持的字符串类、模式串中的特殊字符_学习笔记04

    Lua的函数的定义.math数学函数 定义函数 function [function name] (param1,param2) [function code] --定义一个函数用来求的两个数字的和 ...

  3. Lua 学习笔记(五)函数

    函数的定义:在Lua中,函数是一种对语句和表达式进行抽象的主要机制. 一.函数基本用法        在Lua中,      1.函数既可以完成某项特定的任务.(被视为一条语句)      2.也可以 ...

  4. Lua学习笔记(三):函数和闭包

    函数 lua的函数以function关键字开始,后跟函数名称和参数,最后以end结束,我们看一个简单的函数定义: function foo() --do something end function ...

  5. lua os.date函数定义和示例

    os.date函数定义 原型:os.date ([format [, time]]) 解释:返回一个按format格式化日期.时间的字串或表. lua源码中os.date的注释如下: --- --- ...

  6. lua函数定义

    FuncState proto结构数组保存函数原型信息;prev保存父函数体指针:actvar保存定义的局部变量:upvalues保存upvalue Lua源码中,专门有一个结构体FuncState用 ...

  7. Python函数基础学习(定义、函数参数、递归函数)

    1.本程序是测试函数的基础.函数的参数.递归函数的测试. 函数的参数有: 必选参数.默认参数.可变参数.命名关键字参数和关键字参数 #!/usr/bin/python # -*- coding: ut ...

  8. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  9. lua学习之函数篇

    函数 函数是对语句和表达式进行抽象的主要机制 两种用法 一是可以完成特定的任务,一句函数调用被视为一条语句 二是以只用来计算并返回特定的结果,视为一句表达式 print("Hello, Wo ...

随机推荐

  1. Entity Framework Code-First(9):DataAnnotations

    DataAnnotations in Code-First: EF Code-First provides a set of DataAnnotation attributes, which you ...

  2. Session和cookie有什么区别?

    cookie是保存在客户端的信息,它只能保存String类型的,没有session安全,如果客户端禁用了cookie就不能够使用了 Cookie是客户端技术,程序把每个用户的数据以cookie的形式写 ...

  3. hdu 1576 A/B (求逆元)

    题目链接 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1).   Inpu ...

  4. c# 一维数组的声明方式

    1.直接指定数组元素 int [] arr = {2,4,1,8,4}; 2.只指定数组长度不指定元素值 指定一个长度为5的int型数组 int []  arr = new int[5]; 3.不指定 ...

  5. select下拉框如何与接口配合动态生成option选项

    前几天在做任务时考虑到这个问题,具体任务用例如下: HTML: JS:

  6. CodeForces 116B【二分匹配】

    思路: 暴力..我不会呀.. YY一个二分匹配嘛,然后数组开小了.GG for an hour. #include <bits/stdc++.h> using namespace std; ...

  7. Extensions for Vue

    Extensions for Vue Original post url:https://www.cnblogs.com/markjiang7m2/p/10833790.html If you are ...

  8. 为什么MOBA和吃鸡类游戏不推荐用tcp协议 延迟不利于实时游戏

    http://news.gamedog.cn/a/20171221/2287418.html 我们知道,不同类型的游戏因为玩法.竞技程度不一样,采用的同步算法不一样,对网络延迟的要求也不一样.例如,M ...

  9. 反射实现增删改查(DAO层)——删除数据

    先贴出代码,后续补充自己的思路.配置文件.使用方式: /** * * 删除数据 */ @Override public void deleteObject(List<Map<String, ...

  10. shell括号和linux算术运算

    一.小括号() 1. 单小括号() a).命令组 (a=0;touch a.txt) 小括号中的内容会开启一个子shell独立运行:括号中以分号连接,最后一个命令不需要:各命令和括号无空格 b).命令 ...