lua函数精讲(一)

函数的用途:

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

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

函数的参数为空,必须使用()表示函数调用。例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的。

lua提供了面向对象调用函数的语法

o:foo(x)与o.f(o,x)是等价的。

lua函数的实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分nil补足。

lua函数可以返回多个值,return后列出要返回值的列表即可返回多值

s, e = string.find("hello lua", "lua")

那么,lua是如何调整函数返回值的个数来适应调用环境的呢?

1. use as statement,所以返回值被忽略。

2. use as expression

  • 当作为表达式最后一个参数或仅有的一个参数时,根据变量个数,函数尽可能多地返回多个值,不足补nil,超出舍去。
  • 其他情况函数调用返回第一个值(如果无返回值为nil)
  • 函数调用作为函数参数被调用时,和多值赋值相同
  • 函数调用在表构造中初始化时,和多值赋值相同
  • return f(); f()返回所有值。可以使用括号强制返回一个值return (f())

c语言中,可以使用函数指针来调用可变的函数,可以声明参数可变的函数,但不能两者同时可变。

Lua可以这样来调用可变参数的可变函数:f(unpack(a))

unpack接受一个数组作为输入参数,返回数组所有的元素。注意是数字,返回ipair遍历结果

f = string.find

a = {"hello lua", "lua"}

print(f(unpack(a)))

可变参数使用...表示,Lua将可变参数放在arg的表中,含有一个域n表示参数的个数

function select(n, ...)

return arg[n]

end

给函数参数命名:可以把表作为函数的唯一参数来实现命名参数的功能。

rename {old="temp.lua", new="temp1.lua"}

function rename(arg)

os.rename(arg.old, arg.new)

end

当参数比较多,或容易混淆时,可以采用命名参数。

时间: 2024-10-15 11:11:29

lua函数精讲(一)的相关文章

lua函数精讲(二)

Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其他值(数值,字符串)一样,函数可以被存放在变量中,也存放在表中, 可以作为函数的参数,还可以作为函数的返回值. 词法定界:被嵌套的函数可以访问他外部函数的变量. lua的函数也可以是匿名的,当我们提到函数名时,实际上是说一个指向函数的变量. 闭包 词法界定加上第一类函数是一个功能强大的概念. function sortbygrade(names, grades) table.sort(names, function(n1,n

装饰器函数精讲

阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 举例函数 import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): time.sleep(0.1) print('in fun

iOS开发——语法篇OC篇&高级语法精讲二

Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制. Runtime数据结构 在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方

Spark全面精讲视频_Spark2.0视频

Spark全面精讲(基于Spark2版本+含Spark调优+超多案例) 课程观看地址:http://www.xuetuwuyou.com/course/149 课程出自学途无忧网:http://www.xuetuwuyou.com/ 课程分五个阶段,共115课时! 第一阶段 Spark内核深度剖析 第00节课-课程特色和学习方式 第一节课-Spark概述(四大特性) 第二节课-Spark入门 第三节课-什么是RDD? 第四节课-spark架构 第五节课-linux环境准备(虚拟机,linux)

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

linux驱动开发重点关注内容--摘自《嵌入式Linux驱动模板精讲与项目实践》

本文摘自本人拙著 <嵌入式Linux驱动模板精讲与项目实践> 初步看起来Linux设备驱动开发涉及内容非常多,而须要实现驱动的设备千差万别.事实上做一段时间驱动之后回首看来主要就是下面几点: (1)对驱动进行分类.先归纳为哪个类型的驱动.归类正确再利用内核提供的子系统进行开发,往往会发现事实上非常多通用的事情内核已经帮我们做了,一个优秀的驱动project师应该最大程度上利用内核的资源.内核已经实现的毕竟稳定性强.可移植性高. (2)找到内核的提供的子系统.接下来就是要制作该子系统对该类设备提

Keepalived原理与实战精讲

什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议 注:搞运维的要有足够的耐心哦,不理解协议就很难透彻的掌握keepalived的了 一,VRRP协议VRRP协议学过网络的朋友都知道,网络在设计的

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定.链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢.不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构.它可以通过一

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号, signals.engine_started当Scrapy引擎启动爬取时发送该信号.该信号支持返回deferreds.signals.engine_stopped当Scrapy引擎停止时发送