Lua 第三章--语法

Lua允许“多重赋值”,也就是一下子将多个值赋予多个变量。每个值或每个变量之间以逗号分隔:

a, b = 10, 2*x

在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值。

x, y = y, x        -->交换x 与y

Lua总是会将等号右边值的个数调整到与左边变量的个数相一致。规则是:若值的个数少于变量的个数,那么多余的变量会被赋为nil ;若值的个数更多的话,那么多余的值会被“静悄悄地”丢弃掉。

多重赋值一般很少使用,但在交换两个变量和用于收集函数的多个返回值时还是很有效的。例如,a, b = f(), 函数f 将返回两个值,a接收了第一个,b接收了第二个。

“尽可能地使用局部变量”是一种良好的编程风格。局部变量可以避免将一些无用的名称引入全局环境,避免搞乱了全局环境。此外,访问局部变量比访问全局变量更快。最后,一个局部变量通常会随其作用域的结束而消失,这样便使垃圾收集器可以释放其值。

i = 10             -->全局变量
local j = 2        -->局部变量

在Lua中,有一种习惯写法是:

local foo = foo

这句代码创建了一个局部变量foo,并将用全部变量foo的值初始化它。如果后续其他函数改变了全局foo的值,那么可以在这里先将它的值保存起来。这种方式还可以加速在当前作用域对foo的访问。

Lua不支持switch语句,所以一连串的if then elseif else end 代码是很常见的:

if op == "+" then
    r = a + b
elseif op == "-" then
    r = a - b
elseif op == "*"
    r = a * b
elseif op == "/"
    r = a / b
else
    error("invalid operation")
end

对于while,Lua先测试其条件,如果条件为假,那么循环结束,不然,Lua执行循环体,并重复这一过程:

local i = 1
while a[i] do
    print(a[i])
    i = i + 1
end

repeat - until 语句重复执行其循环体直到条件为真时结束。测试是在循环体之后做的,因此循环体至少会执行一次。

--打印输入的第一行不为空的内容
repeat
    line  = io.read()
until line ~= ""
print(line)

与其他大多数语言不同的是,在Lua中,一个声明在循环体中的局部变量的作用域包括了条件测试:

local sqr = x/2
repeat
    sqr = (sqr + x/sqr) / 2
    local error = math.abs(sqr^2 - x)
until error < x/10000            -->在此仍可以访问error

for 语句有两种形式:数字型for 和泛型for。

数字型for 的语法如下:

for var=exp1, exp2, exp3 do
    <执行体>
end

var从exp1 变化到exp2,每次变化都以exp3作为步长递增var,并执行一次“执行体”。第三个表达式exp3 是可选的,若不指定的话,Lua会将步长默认为1.

需要注意的是:控制变量会被自动地声明为for语句的局部变量,并且仅在循环体内可见。因此,控制变量在循环结束后就不存在了。如果需要在循环结束后访问控制变量的值(通常是在break 循环时),必须将该值保存到另一变量中!

泛型for 循环通过一个迭代器(iterator)函数来遍历所有值:

--打印数组a 的所有值
for i, v in ipairs(a) do
    print(v)
end

Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代函数。在每次循环中,i 会被赋予一个索引值,同时v 被赋予一个对应于该索引的数组元素值。

--打印table t 中所有的key
for k in pairs(t) do
    print(k)
end
时间: 2024-10-09 22:26:13

Lua 第三章--语法的相关文章

Lua 第三章--表达式

表达式用于表示值.Lua的表达式中可以包含数字常量.字面字符串.变量.一元和二元操作符及函数调用.另外有别于传统的是,表达式中还可以包括函数定义和table构造式. Lua支持常规的算术操作符有:二元的+.-.*./.^.%,及一元 - (负号).取模操作符计算结果的符号永远与第二个参数相同. Lua提供的关系操作符有:>.<.>=.<=.==.~=.所有这些操作符的运算结果都是true或false. 逻辑操作符有and.or 和not .与条件控制语句一样,所有的逻辑操作符将fa

代码之髓-第三章-语法的诞生

栈机器和FORTH 查看栈型机器VM的执行语句(Python为例) >>> import dis>>> dis.dis(lambda x, y, z : (x + y) * z) 2    0 LOAD_FAST 0 (x) 3 LOAD_FAST 1 (y) 6 BINARY_ADD 7 LOAD_FAST 2 (z) 10 BINARY_MULTIPLY 11 RETURN_VALUE 语法树和LISP >>> import ast >>

Programming In Lua 第三章

1, 2, 3, 4, 5,lua中,只有false和nil为假,0和空字符串为真. 6, 7,

语法》第三章 数值

(本文为阮一峰js标准教程的学习笔记,旨在总结该教程中涉及的知识点大纲及个人所做的一些拓展,方便作为"目录"或者"大纲"复习和查漏补缺,详细内容请参见阮一峰教程原文) 第二部分 语法 **********第三章 数值*************** 一.概述1.所有数都是以64位浮点数形式储存的.1与1.0相同(8bit.也就是64位二进制数)2.JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数).3.由于浮点数不是精确的值,所以涉及小数的

第三章 表达式 Lua程序设计笔记

--第三章 表达式--3.1 算数操作符--3.2 关系操作符其计算结果是true或false.如果两个值的类型不同,则Lua认为他们不相等.nil只与自身相等.对于table.userdata和函数,Lua作引用比较,只有当它们引用同一个对象时,才认为它们相等. --3.3逻辑操作符--3.4字符串连接Lua中字符串是不可变的值,连接操作符只会创建一个新字符串,而不会对员操作数进行修改.--3.5优先级Lua二元操作符中只有^ 和..是右结合,其他都是左结合 --3.6table构造式{} 混

第三章:绑定语法(1)

第三章所有代码都需要启用KO的 ko.applyBindings(viewModel); 功能,才能使代码生效,为了节约篇幅,所有例子均省略了此行代码. 1 visible 绑定 目的 visible绑定到DOM元素上,使得该元素的hidden或visible状态取决于绑定的值. 例子 <div data-bind="visible: shouldShowMessage"> You will see this message only when "shouldSh

标准库》第三章 包装对象和Boolean对象

第三部分  标准库 ***************第三章   包装对象和Boolean对象******************* 一.包装对象的定义[1]有人说,JavaScript语言"一切皆对象",数组和函数本质上都是对象,就连三种原始类型的值--数值.字符串.布尔值--在一定条件下,也会自动转为对象,也就是原始类型的"包装对象". 所谓"包装对象",就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象

JavaScript高级程序设计(第3版)第三章读书笔记

第三章  基本概念 ECMAScript中的一切(变量.函数名和操作符)都区分大小写. 标识符是指变量.函数.属性的名字,或者函数的参数. 标识符的组成规则是:第一个字符必须是一个字母.下划线(_)或一个美元符号($):其他字符可以是字母.下划线.美元符号或数字. ECMAScript标识符采用驼峰大小写格式. ECMAScript注释包括单行注释(//)和块级注释(/*  *  */). ECMAScript 5引入了严格模式的概念,严格模式是为JavaScript定义了一种不同的解析与执行模

Javascript高级程序设计——第三章:基本概念

javascript高级程序设计——第三章:基本概念 一.语法 EMCA-262通过叫做ECMAScript的“伪语言”为我们描述了javascript实现的基本概念 javascript借鉴了C的语法,区分大小写,标示符以字母.下划线.或美元符号($)开头,注释可以用 // 或者/* */ 严格模式: ECMAScript 5引入了严格模式,在严格模式下不确定的行为将得到处理,通过在顶部添加 “use strict”来启用严格模式: function fuc(){ "use strict&qu