lua进阶(一)

第一章 概览

    1、chunks

             chunks是一系列语句, lua执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个chunks。

     2、全局变量

            全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,全局变量的初始值为

print(b) -->nil
b = 10
print(b) -->10

    3、词法约定

       Lua保留字

and   break  do  else  elseif
end   false  for   function  if
in  local  nil   not   or
repeat  return  then  true  until
while

  Lua是大小写敏感的。

  注释: 单行注释: --

多行注释: –[[ –]]

--[[
-- comment
--]]

   4、命令行方式

 

 

 

第二章 类型和值

  Lua是动态类型语言,变量不要类型定义。 Lua中有8个基本类型:nil、boolean、 number、

   string、userdata、function、thread、和table,函数type可以测试变量或者值的类型

    1、Nil lua的特殊类型, 只有一个值 nil

    2、Booleans  取值false true

    3、Numbers 表示实数,Lua中没有整数。

    4、Strings 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。

          string和其他对象一样,Lua自动进行内存分配和释放

         可以使用单引号或者双引号表示字符串

a = "a line"
b = ‘another line‘

        转义

\a bell
\b back space   -- 后退
\f form feed  -- 换页
\n newline   -- 换行
\r carriage return    -- 回车
\t horizontal tab   -- 制表
\v vertical tab
\\ backslash  -- "\"
\" double quote     -- 双引号
\‘ single quote     -- 单引号
\[ left square bracket   -- 左中括号
\] right square bracket  -- 右中括号

例子:

> print("one line\nnext line\n\"in quotes\", ‘in quotes‘")
one line
next line
"in quotes", ‘in quotes‘
> print(‘a backslash inside quotes: \‘\\\‘‘)
a backslash inside quotes: ‘\‘
> print("a simpler way: ‘\\‘")
a simpler way: ‘\‘

5、Functions

     函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数

    的参数,也可以作为函数的返回值。

6、Userdata and Threads

    userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外

    没有预定义的操作。userdata用来描述应用程序或者使用C实现的库创建的新类型。

 

第三章  表达式

     Lua中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。

     还可以是非传统的函数定义和表构造。

  1、算数运算符

    二元运算  + – * / ^ (幂)

    一元运算 –(负值)

  2、关系运算

     <   >     <=    >=   ==      ~=

  3、逻辑运算

     and  or  not

  4、连接运算

     .. --两个点

print("Hello ".. "World")  --> Hello World
print(0 .. 1)  --> 01

  5、优先级

    从高到低的顺序:

^
not - (unary)
*  /
+  -
..
< > <= >= ~= ==
and
or

  6、表的构造

    构造器是创建和初始化表的表达式,{}构建一个空表,

    可以直接初始化数组

    构造函数可以使用任何表达式初始化

    构造结构体  record

days = {"Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday"} 

tab = {math.sin(1), math.sin(2), math.sin(3), math.sin(4),
        math.sin(5),math.sin(6), math.sin(7), math.sin(8)} 

for k, v in pairs(days) do
    print(v)
end

for k, v in pairs(tab) do
    print(v)
end

--record
a ={x = 23,y= 39} -- a ={} a.x = 0 a.y=0
print(a.x,a.y)

  第四章  基本语法

    1、赋值语句

          赋值是改变一个变量的值和改变表域的最基本方法

a = "hello".."world"
t ={n=2,m=0}
t.n = t.n + 1

x = 3
a,b = 10, 2 * x
print(a,b)

  2、局部变量与代码块(block)

使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块

内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那

个文件或者文本串)。

x = 10
locali = 1     -- local to the chunk
whilei<=x do
localx = i*2   -- local to the while body
print(x)  --> 2, 4, 6, 8, ...
 i = i + 1
end
ifi > 20 then
localx  -- local to the "then" body
 x = 20
 print(x + 2)
else
print(x)  --> 10 (the global one)
end
print(x)  --> 10 (the global one)

  3、控制结构语句

   条件控制

print("enter a number")
n = io.read("*number")
if n > 0 then
    print(n.." bigger than zero")
elseif n > 100 then
    print(n.." bigger than 100")
else
    print(n.." smaller than zero")
end  -- remember the end

  循环控制

n = 3

while n > 0 do
    print(n)
    n = n - 1
end

n  = 3
repeat
    print(n)
    n = n -1
until n < 0

m = 0
for i = 1, 10, 1 do
    m = m + i
    print(i * m)
end

范型for循环

month ={"Jan","Feb","Mar","Apr","May","Jun",
    "Jul","Aug","Sep","Oct","Nov","Dec"}
for k,v in pairs(month) do
    print(k,v)
end

for k,y in ipairs(month) do
    print(k,month[k])
end

    break和return

break语句用来退出当前循环(for,repeat,while)。在循环外部不可以使用。

return 用来从函数返回结果,当一个函数自然结束结尾会有一个默认的return。(这

种函数类似pascal的过程)

n = 3
while 1 > 0 do
    print(n)
    n = n - 1
    if n < 0 then
        break
    end
end

function max(x,y)
    if x > y then
        return x
    else
        return y
    end
end

print(max(23,0))
时间: 2024-10-05 02:35:52

lua进阶(一)的相关文章

lua进阶8-- C++读取lua文件里的三维表

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前面lua进阶里面讲到用C++读取二维表,但是最近又有了新的需求,lua文件里面出现了三维表,自己摸索了一下,终于找到了解决的方式,在这里面与大家分享一下</span> 我的lua文件里面的三维表结构如下 stage = { {m_nId = 105,m_nBoss = 0,

Lua进阶(一)——函数闭包、元表

函数闭包 function createCountdownTimer(second) local ms=second * 1000; local function countDown() ms = ms - 1; return ms; end return countDown; end timer1 = createCountdownTimer(1); for i=1,3 do print(timer1()); end print("------------"); timer2 = c

Lua进阶(二)——函数环境、包

函数环境 function foo() print(g or "No g defined!") end foo() setfenv(foo, { g = 100, print = print }) --设置foo的环境为表{ g=100, ...} foo() print(g or "No g defined!") --No g defined! --100 --No g defined! 定义:函数环境就是函数在执行时所见的全局变量的集合,以一个表来承载. 说明:

lua进阶7--- 面向对象

lua 里面的面向对象可以使开发看起来更简洁 local tmp = {}; function tmp:create(id) local obj = { m_id = id, m_name = "guoyilong ", }; setmetatable(obj, {__index = tmp}); return obj; end function tmp:printout() self.m_id = self.m_id * 45; print("===========>

[Lua]Lua的面向对象程序设计

Lua中的表不仅在某种意义上是一种对象.像对象一样,表也有状态(成员变量):也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象:一个对象在不同的时候也可以有不同的值,但他始终是一个对象:与对象类似,表的生命周期与其由什么创建.在哪创建没有关系. local Account = {balance = 0} function Account.withdraw(v) Account.balance = Account.balance - v end --调用方法如下:

[原创]cocos2d-lua学习笔记(0)-提纲

cocos2d-lua的学习提纲 搭建 cocos2d -lua 开发环境 cocos2d -lua 基础入门 cocos2d -lua 进阶框架学习,提高开发效率 导出自定义C++对象到Lua中 在 C++ 和 Lua 间传递数据与对象 Lua 中的异步网络请求 编译并加密 Lua 脚本 发布游戏

公司新人培训-后端技能树

1.前端篇: 基本的 JS 与 CSS至少需要有一个大概的认识 基础 常见的状态码  与 后端相应的错误排查 301与 302的区别 304如何产生与如何避免 … JSONP 与 JSON 构造一个jsonp的请求的方式 原生的如何构造 jquery如何构造 … 构造一个jsonp响应 AJAX 如何构造一个AJAX请求 原生的如何构造 jquery如何构造 …. 跨域的几种处理方式 场景 同主域不同子域 不同主域 处理方式 iframe 代理请求 script元素的src属性 ( jsonp 

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope

Redis进阶应用:Redis+Lua脚本实现复合操作

一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Redis已成为当前架构设计中的首选key-value存储系统. 虽然Redis官网上提供了200多个命令,但做程序设计时还是避免不了为了实现一小步业务逻辑而多次调用Redis的情况. 以compare and set场景为例.如果使用Redis原生命令,需要从Redis中获取这个key,然后提取其中的