《Lua程序设计》第5章 函数 学习笔记
Lua为面向对象式的调用也提供了一种特殊的语法——冒号操作符。表达式o.foo(o, x)的另一种写法是o:foo(x),冒号操作符是调用o.foo时将o隐含地作为函数的第一个参数。
Lua可以调用C语言编写的函数。
5.1 多重返回值(multiple results)
Lua允许函数返回多个结果。Lua的几个预定义函数就是返回多个值的。例如,用于在字符串中定位一个模式(pattern)的函数string.find。该函数若在字符串中找到了指定的模式,将返回匹配的骑士字符和结尾字符的索引。在此就需要使用多重赋值语句来接收函数的返回值。
s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9
unpack函数接受一个数组作为参数,并从下标1开始返回该数组的所有元素:
print(unpack{,,}) --> 10 20 30
a,b = unpack{,,} --> a=10, b=20, 30被丢弃
unpack的一项重要用途——泛型调用(generic call)。
5.2 变长参数(variable number of arguments)
“...”
Lua中的函数还可以接受不同数量的实参。例:
function add(...)
local s =
for i, v in ipairs{...} do
s = s + v
end
return s
end print(add(, , , , )) --> 54
参数列表中的3个点(...)表示该函数可接受不同数量的实参。当这个函数被调用时,它的所有参数都会被收集到一起。这部分收集起来的实参称为这个函数的“变长参数(variable arguments)”。一个函数要访问它的变长参数是,仍需用到3个点(...)。但不同的是,此时这3个点是作为一个表达式来使用的。在上例中,表达式{...}表示一个由所有变长参数构成的数组。而函数add遍历了该数组,并累加了每个元素。
多值恒定式(multi-value identity)函数:function id(...) return ... end
5.3 具名实参(named arguments)
-- 无效的演示代码
rename(old="temp.lua", new="temp1.lua")
Lua并不支持这种语法,但可以通过一种细微的改变来获得相同的效果。主要是将所有实参组织到一个table中,并将这个table作为唯一的实参传给函数。另外,还需要用到一种Lua中特殊的函数调用语法,就是当实参只有一个table构造式时,函数调用中的圆括号是可有可无的:
rename{old="temp.lus", new="temp1.lua"}
另一方面,将rename改为只接受一个参数,并从这个参数中获取实际的参数:
function rename(arg)
return os.rename(arg.ld, arg.new)
end
若一个函数拥有大量的参数,而其中大部分参数是可选的话,这种参数传递风格会特别有用。例如在一个GUI库中,一个用于创建新窗口的函数可能会具有许多的参数,而其中大部分是可选的,那么最好使用具名实参:
w = Window{ x = , y = , width = , height = ,
title = "Lua", background="blue",
border = true
}
Window函数可以根据要求检查一些必填参数,或者为某些参数添加默认值。假设“_Window”才是真正用于创建新窗口的函数,它要求所有参数以正确的次序传入,那么Window函数可以这么写:
function Window(options)
-- 检查必要的参数
if type(options.title) ~= "string" then
error("no title")
elseif type(options.width) ~= "number" then
error("no width")
elseif type(options.height) ~= "number" then
error("no height")
end -- 其他参数都是可选的
_Window(options.title,
options.x or , -- 默认值
options.y or , -- 默认值
options.width, options.height,
options.background or "white", -- 默认值
options.border -- 默认值
)
end
《Lua程序设计》第5章 函数 学习笔记的更多相关文章
- C++学习基础十六-- 函数学习笔记
C++ Primer 第七章-函数学习笔记 一步一个脚印.循序渐进的学习. 一.参数传递 每次调用函数时,都会重新创建函数所有的形参,此时所传递的实参将会初始化对应的形参. 「如果形参是非引用类型,则 ...
- 《C++Primer》第五版习题答案--第六章【学习笔记】
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...
- 20145213《Java程序设计》第八周学习笔记
20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...
- 《C++Primer》第五版习题解答--第四章【学习笔记】
[C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...
- 《C++Primer》第五版习题答案--第五章【学习笔记】
<C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...
- 《Lua程序设计》第6章 深入函数 学习笔记
在Lua中,函数是一种“第一类值(First-Class Value)”,它们具有特定的词法域(Lexical Scoping).“词法域”:函数可以潜逃在另一个函数中,内部的函数可以访问外部函数中的 ...
- 《C++Primer》第五版习题答案--第三章【学习笔记】
[C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...
- 《汇编语言程序设计》(Professional Assembly Language)学习笔记(二)
挖坑:学习笔记(一)讲述如何在 Windows Vmware 上安装 Ubuntu 20.04 实践环境 本文是基于Ubuntu 20.04平台进行实验,下文中的解决方法都基于此前提 问题记录 问题一 ...
- 《Lua程序设计》第4章 语句 学习笔记
Lua中的常规语句包括:赋值.控制结构和过程调用.Lua还支持一些不太常见的语句,如:多重赋值(multiple assignment) 和 局部变量声明.4.1 赋值Lua允许“多重赋值”,也就是一 ...
随机推荐
- Java如何处理运行时异常?
在Java编程中,如何处理运行时异常? 此示例显示如何处理java程序中的运行时异常. package com.yiibai; public class RuntimeExceptions { sta ...
- JDBC SQL语法
结构化查询语言(SQL)是一种标准化语言,允许对数据库执行操作,例如:创建数据记录,读取内容,更新内容和删除数据记录等. 本教程中将概述SQL,这是了解和学习JDBC概念的前提条件. 经过本章后,您将 ...
- 使用Eclipse的JUnit实例
在本节中,我们将展示使用JUnit的一个完整的例子.我们将详细了解如何创建和运行测试,我们将展示如何使用特定的注释和JUnit断言. 1. 初始步骤 让我们创建一个名为 JUnitGuide 的Jav ...
- C#或者.NET下的强制垃圾回收办法
转载 2011年03月16日 17:21:00 标签: c# / .net / button / object / stream / class 8185 今天来谈谈C#的GC,也就是垃圾回收机制,非 ...
- Cisco 交换机修改密码
实验环境: 公司有一台思科交换机忘记登录密码,无法进入到特权模式下. 实现功能: 修改特权模式下的登录密码 1. 桌面 ---- 开始 ---- 所有程序 ---- 附件 ---- 超级终端 -- ...
- R语言绘图时的边界碰撞问题
当我们在绘图时,经常会遇到这样的问题,添加的文字标记超出了坐标系的问题,导致文字显示不全 比如下面这个例子: plot(c(1,5),c(1,5)) text(5,5.1,"ABCDEF&q ...
- SecureCRT同时发送命令到所有主机
有时候我们需要在多台服务器上执行相同的命令,比如安装软件,复制,粘贴,删除等等,但一台一台的去操作工作量就太大了,我们可以借助SecureCRT这款客户端远程连接工具实现这样的要求! 相关阅读: 如何 ...
- Spring集成线程池
自己在程序中手动New很容易造成线程滥用,创建线程也是比较消耗资源的操作,所以建议如果有此需求,将线程池统一交给Spring框架进行管理. 如下: <!--Spring 集成线程池,不允许自己开 ...
- Centos7 安装redis服务
Redis的安装 1.先安装gcc编译器,否则make的时候会报错 yum -y install gcc 2.下载redis安装包,解压编译安装 $ wget http://download.redi ...
- Java常用类(二)String类详解
前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...