1: 字符串转化为数字类型, tonumber
数字类型转化为字符串, tostring
.. 为字符串连接运算符
print (0 .. 1) --> 01
print (10 .. "" == "10") 等价于 print (tostirng(10) == "10")
2:
C 语言中的三元运算符
a?b:c
在 Lua 中可以这样实现:
(a and b) or c
3: 除了^和..外所有的二元运算符都是左连接的。
x^y^z <--> x^(y^z)
4: 遇到赋值语句,lua会首先计算右边所有的值,然后赋值给左边,也就是隐式创建了临时变量,所以可以进行变量的交换
x, y = y, x -- swap x,y的值
a[i], a[j] = a[j], a[i] -- swap a[i],a[j]的值
5: 当变量个数和值的个数不一致时,Lua 会一直以变量个数为基础采取以下策略:
 a. 变量个数>值的个数 按变量个数补足nil
b. 变量个数<值的个数 多余的值会被忽略
例如:
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2
print(a,b) --> 1 2
a, b, c = 0 --> 0 nil nil
print(a,b,c)
6: 第一,当作为表达式调用函数时,有以下几种情况:
1. 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能
多地返回多个值,不足补 nil,超出舍去。
2. 其他情况下,函数调用仅返回第一个值(如果没有返回值为 nil)
假设有如下三个函数:
function foo0 () end -- returns no results
function foo1 () return 'a' end -- returns 1 result
function foo2 () return 'a','b' end -- returns 2 results
x,y = foo2(), 20 -- x='a', y=20
x,y = foo0(), 20, 30 -- x='nil', y=20, 30 is discarded
第二,函数调用作为函数参数被调用时,和多值赋值是相同。
print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2(),1) --> a 1
print(foo2() .. "x") --> ax
第三,函数调用在表构造函数中初始化时,和多值赋值时相同。
a = {foo0()} -- a = {} (an empty table)
a = {foo1()} -- a = {'a'}
a = {foo2()} -- a = {'a', 'b'}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4
另外,return f()这种类型的返回 f()返回的所有值
function foo (i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
print(foo(1)) --> a
print(foo(2)) --> a b
print(foo(0)) -- (no results)
print(foo(3)) -- (no results)
可以使用圆括号强制使调用返回一个值。一个 return 语句如果使用圆括号将返回值括起来也将导致返回一个值。
print((foo0())) --> nil
print((foo1())) --> a
print((foo2())) --> a
7: 利用可变参数声明一个 select 函数:
function select (n, ...)
return arg[n]
end
print(string.find("hello hello", " hel")) --> 6 9
print(select(1, string.find("hello hello", " hel"))) --> 6
print(select(2, string.find("hello hello", " hel"))) --> 9
8: 闭包。
function newCounter()
local i = 0
return function() i=i+1
return i
end
end
闭包内的匿名函数使用 upvalue i 保存他的计数,当我们调用匿名函数的时候 i 已经超出了作 用范围,因为创建 i 的函数 newCounter 已经返回了。然而 Lua 用闭包的思想正确处理了这种情况。
c1 = newCounter()
print(c1) --> function: 0x8af6750
print(c1()) --> 1
print(c1()) --> 2
print(newCounter()) --> function: 0x8af6c60
print(newCounter()) --> function: 0x8af6c60
print(newCounter()()) --> 1
print(newCounter()()) --> 1
由此可见,闭包函数返回的是一个函数,当再次调用这个返回的函数的时候,他访问的外部的变量依然存在在某个作用域
简单的说闭包是一个函数加上它可以正确访问的 upvalues。如果我们再次调 用 newCounter,将创建一个新的局部变量 i,因此我们得到了一个作用在新的变量 i 上的 新闭包。
c2 = newCounter()
print(c2()) --> 1
print(c1()) --> 3
print(c2()) --> 2
9: 非全局函数
Lua 中函数可以作为全局变量也可以作为局部变量,我们已经看到一些例子:函数 作为table的域(大部分Lua标准库使用这种机制来实现的比如io.read、math.sin)。这种 情况下,必须注意函数和表语法:
1. 表和函数放在一起
Lib = {}
Lib.foo = function (x,y) return x + y end
Lib.goo = function (x,y) return x - y end
2. 使用表构造函数
Lib = {
foo = function (x,y) return x + y end,
goo = function (x,y) return x - y end
}
3. Lua 提供另一种语法方式
Lib = {}
function Lib.foo (x,y)
return x + y
end
function Lib.goo (x,y)
return x - y
end
当我们将函数保存在一个局部变量内时,我们得到一个局部函数,也就是说局部函 数像局部变量一样在一定范围内有效。
下面是声明局部函数的两种方式:
1. 方式一
local f = function (...)
...
end
local g = function (...)
...
f() --externallocal`f'isvisiblehere
...
end
2. 方式二
有一点需要注意的是在声明递归局部函数的方式:
local function f (...)
...
end
local fact = function (n)
if n == 0 then
return 1 else
return n*fact(n-1) -- buggy
end end

上面这种方式导致 Lua 编译时遇到 fact(n-1)并不知道他是局部函数 fact,Lua 会去查找是否有这样的全局函数 fact。为了解决这个问题我们必须在定义函数以前先声明:
local fact
fact = function (n)
if n == 0 then
return 1 else
return n*fact(n-1)
end
end
这样在 fact 内部 fact(n-1)调用是一个局部函数调用,运行时 fact 就可以获取正确的 值了。
但是 Lua 扩展了他的语法使得可以在直接递归函数定义时使用两种方式都可以。 在定义非直接递归局部函数时要先声明然后定义才可以:

local f, g -- `forward' declarations
function g ()
... f() ...
end
function f ()
... g() ...
end
10: 一个 list 写一个简单的迭代器
function list_iter (t)
local i = 0
local n = table.getn(t) --返回list的size
return function ()
i=i+1
if i <= n then return t[i] end
end
end
t = {10, 20, 30,5,6,7}
iter = list_iter(t) -- creates the iterator
while true do
local element=iter() --calls the iterator
if element == nil then
break
end
print(element)
end
我们设计的这个迭代器也很容易用于范性 for 语句
t = {10, 20, 30}
for element in list_iter(t) do
print(element)
end
分享到:
相关推荐
lua学习笔记
自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费
### Lua基础学习笔记 #### 一、Lua简介与特点 Lua是一种轻量级且高效的脚本语言,广泛应用于游戏开发、网页应用、图形界面等领域。对于已有其他编程语言基础的学习者来说,掌握Lua通常较为迅速。Lua的设计哲学是...
**lua (VC环境) 学习笔记** 在深入学习lua编程语言并将其应用于Microsoft Visual C++(VC环境)时,我们需要了解几个关键知识点。lua是一种轻量级的脚本语言,设计目标是作为嵌入式语言,使得游戏开发、系统管理、...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。它的设计目标是简洁、高效、可扩展。在“lua基础笔记”中,我们可以探索以下关键知识点: 1. ** Lua语法基础 **:Lua的语法简洁明了,...
【cocos2dx_lua开发笔记】是一篇个人实践总结,主要涵盖了使用cocos2dx_lua进行游戏开发的一些关键点,包括...通过学习和理解这些笔记,开发者能够更好地理解和运用cocos2dx_lua进行游戏场景、UI元素和动画效果的构建。
【Lua学习笔记之表达式】 在Lua编程语言中,表达式是构成程序的基本元素,用于表示计算或逻辑操作。表达式的结果可以是一个值,也可以是一个布尔值,这取决于执行的操作。下面我们将深入探讨Lua中的各种表达式类型...
【Lua (VC环境) 学习笔记】 Lua是一种轻量级的、开源的脚本语言,主要用于嵌入式系统和游戏开发。它以其简洁的语法、高效性和易于集成的特点受到广泛欢迎。在VC(Visual C++)环境中使用Lua,可以为C++应用程序提供...
Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)
本文将围绕"Cocos2d-x Lua"这一主题,深入探讨其相关知识点,为新手提供一份全面的学习指南。 一、Cocos2d-x 简介 Cocos2d-x 是一个基于 C++ 的 2D 游戏开发框架,它提供了丰富的图形绘制、动画控制、物理引擎等...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。这个"Lua使用笔记"的压缩包包含了三个文件:hello3.lua、...如果你对 Lua 感兴趣,那么这个"Lua使用笔记"的压缩包将是一个很好的学习起点。
Lua的类型与值的学习笔记为我们提供了对这些基础知识的全面了解,对于Lua新手来说是一份宝贵的资料。通过这些知识点的学习,开发者可以更加有效地编写Lua程序,并在日常开发中避免一些常见错误。
Lua是一种轻量级的嵌入式脚本语言,它的语法简洁且易于学习,而C++则以其强大的性能和灵活性著称。将两者结合可以让我们在C++程序中利用Lua的便利性编写脚本,进行逻辑控制或动态行为。 一、Lua与C++的交互 1. Lua ...
【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...
Lua是一种轻量级的脚本语言,具有易于嵌入到应用程序中、支持面向过程和函数式编程、拥有灵活的变量作用域等特点。本文将介绍Lua中函数的基础用法、变长参数、closure(闭包)、以及select函数的使用,并结合代码...
### Lua基础应用知识点详解 #### 一、Lua简介与特性 ...以上内容覆盖了Lua的基本语法和常用操作,是学习Lua的入门必备知识点。对于从事Unity3D开发或者对Lua感兴趣的朋友来说,掌握这些内容将极大地提高编程效率。
1. **简单易学**: Lua 是一种简洁的、解释型的脚本语言,语法清晰,易于学习和理解。 2. **嵌入式编程**: Lua 以其小巧的体积和高效的设计,常被嵌入到其他应用程序中作为扩展语言。 3. **数据表示**: Lua 有表...
10. **学习笔记的价值**:他人的学习笔记可能包含实践中的经验总结、常见问题的解决方法,对于初学者来说,是一份宝贵的参考资料。 总的来说,这个资源包提供了一个全面的学习路径,涵盖了从基础的Lua语言学习到在...