ILD

lua reference manual学习笔记1 Basic Concepts
作者:YUAN JIANPENG 邮箱:yuanjp@hust.edu.cn
发布时间:2018-9-19 站点:Inside Linux Development

Basic Concepts

这节描述语言的基本概念

Values and Types

lua是一个dynamically typed language. 也就是说变量没有类型,只有值,语言中没有类型定义,所有的值都携带它们自己的类型。


所有的值都是first-class值,意味着所有的值可以存储到变量,作为参数传递给其它函数,返回为值。


LUA有8个基本类型:nil, boolean, numer, string, function, userdata, thread, table。


nil只有一个值nil。boolean有两个值,false和true。


nil和false使条件为假,任何其它值使条件为真。


string表示字节序列。字符串可以包含任何8位序列,甚至'\0'


number内部有两种subtype,一种是integer,一种是float。标准LUA使用64位整数,双精度浮点数。但是编译时可以指定32位整数和单精度浮点数。


LUA可以调用LUA写的函数,和C写的函数。这两种类型都是function。


userdata允许任何c数据存储到LUA变量中。有两种userdata,full userdata,object的整个数据块由LUA管理,还有一个light userdata,只是存储一个C指针。


thread类型是独立的执行线程。


table是关联数组。任何值除了nil和NaN都可以做下标。除了nil,任何类型都可以作为值,如果一个key的value为nil,那么这个key不认为是table的一部分。相对的,任何不是table一部分的key的值都是nil。


a[i]和a[j]是同一个表元素,当且仅当i和j是raw equal的情况下。除了一种情况,为整数值的浮点数和对应的整数。 如a[1.0]和a[1]是同一个整数。


table, function, threads, (full) userdata是objects。变量不包含这些值,仅仅是包含它们的引用。赋值、参数传递、函数返回只是维护这些值的引用,这些操作不会做实际的拷贝。


库函数type,返回描述给定值的类型的字符串。


Environments and Global Environment

任何free name (没有绑定到任何声明)var,都被翻译为_ENV.var。


每个chunk都被编译为一个叫做_ENV的external local variable的范围内。_ENV不是一个free name。


但是_ENV是一个regular name,可以用来定义变量和参数。


任何作为_ENV的值的table都被叫做environment。


还有一个global environment,全局变量_G的值,被初始话为全局环境的值。


当LUA加载一个chunk时,_ENV的缺省值被更新为global environment。


所有的标准库被载入到global environment。


可以使用load来加载一个有不同环境的chunk。


Error Handling


Metatables and Metamethods

LUA中的每一个值都有一个metatable。metatable是一个普通的Lua table,


例如一个非数字值作为加法的操作数,Lua检查这个值的metatable是否有一个_add key,其值是一个function类型。Lua调用这个函数做加法。


metatable的key是一个字符串,以两个下划线开始,其值叫做metamethods。如__add。


使用getmetatable获取一个变量的metatable


使用rawget获取metamethods


rawget(getmetatable(o) or {}, "__ev")


使用setmetable函数设置metatable,但是只能在C API函数中设置。


Tables和full userdata有独立的metatables


所有其它类型的值每个类型共享一个metatable。


Garbage Collection

lua自动执行内存管理。


Coroutines

Lua支持coroutines,被叫做collaborative multithreading。

只有显示执行yield函数,才会挂起它自己的执行。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.