zoukankan      html  css  js  c++  java
  • 学习lua(一) 认识了解lua

    lua 语句之间可以用分隔符也可以不用分隔符,LUA的语法中,代码中的换行不起任何作用

    例如:一下四个程序块都是合法的,并且完全等价 

    a=1

    b=a*2

    a=1

    b=a*2

    a=1; b=a*2

    a=1 b=a*2  --有点难看,但却是合法的

    用lua解释器解释lua脚本命令

    % lua hello.lua

    II 词法

    Lua中的标识符可以是由任意字,数字和下划线构成的字符串,但不能以数字开头。

    注意:应该避免使用以一个下划线开头并跟着一个或多个大写字母(例如:“_VERSION”) 的标识符,Lua将这类标识符保留用作特殊用途。

    通常保留标识符“—”(一个下划线)作为“亚变量”使用。

    Lua的保留字都有哪些呢?

    and  break  do  else  elseif

    end  false  for  function  if

    in  local  nil  not  or

    repeat  return  then  true  until

    while

    III 代码注释

      --行注释

      --[[......--]]  多行注释

    IV.全局变量和局部变量

      在lua中默认变量都是全局变量,当需要局部变量的时候可以用关键字:local

      在lua中访问一个未初始化的变量不会引发错误,访问结果是一个特殊的值nil

        例如: print(b) --nil

       通常没有必要删除一个全局变量。如果一个变量只有较短的生存周期,那么就应该使用局部变量。

        但是如果一定要删除某个全局变量的话,只需要将其赋值为nil

    2. 类型与值

      Lua是一种动态类型的语言。在语言中没有类型的定义的语法,每个值都携带了它自身的类型信息,也就可以这样理解

      你为这个变量赋予什么类型的值,那么这个变量就是什么类型的变量

      Lua中共有8种基础类型: nil (空), boolean,  number  string  userdata  function  thread  table(表)

      函数type可根据哦一个值返回其类型名称

      print(type("hello world"))   -->string

      注意:type(x) type的返回类型为string

      

      变量没有预定义的类型,任何变量都可以包含任何类型的值

      print(type(a)) --nil

      a=10

      a="a string!"

      print(type(a))

      a=print

      a(type(a)) -->function

      类型:Boolean :false/true  Lua将值false和nil视为“假” ,而将出此之外的其他值视为"真“。

      例子:

        a="one string"

        b=string.gsub(a,"one","another")  --修改字符串的一部分

        print(a)  -->one string

        print(b)  -->another string

        Lua的字符串和其他Lua对象(例如:table或函数等)一样,都是自动内存管理机制,所管理的对象。这表示无需担心字符串的分配和释放,Lua处理这些事情。一个字符串可以小到只包含一个字母,也可以大到包含整本书。Lua能够高效地处理长字符串。在Lua程序中操作100K或1M的字符串是很常见的。

        字符串的书写方式:a="a line"  b='another line'

        

      另外,还可以用一对匹配的双方括号来界定一个字母字符串,就像写"块注释” 那样。以这种形式书写的字符串可以延伸多行,Lua

      不会解释其中的转义序列。此外,如果字符串的第一个字符是一个换行字符,那么Lua会忽略它。这种写法对于书写那种含有程序

      代码的字符串尤为有用。如下列:

        page[[

          <html>

            <head>

            <title>An HTML Page</title>

            </head>

          <body>

            <a href="http://www.antknow.net">Lua</a>

          </body>

        </html>

      ]]

       2) 也可以用[===[ ....]===]    相同数量的等号,就可以在不加转义的情况下,直接嵌入任意的字符串内容了

        这套机制也同样适用于注释。例如,以“--[=[........]=] 如此便简化了注释那些”已经包含了注释块“的代码。

       3) Lua 提供了运行时的数字与字符串的自动转换。在一个数字字符串上,应用算术操作时,Lua会尝试将这个字符串转换成一个数字

        print("10"+1)   --> 11

        print("hello"+1)  -->错误,(不能转换“hello”)

       4) print(10 .. 20)   --》1020

          在lua中,“.."是字符串连接操作符。当直接在一个数字后面输入它的时候,必须用一个空格来分割他们。

        如今,人不能确定在lua的设计中,这些自动的强制转换是否算一项好的设计,建议,最好不要依赖他们。

        如果需要显示地讲一个字符串转换成数字,可以使用函数:tonumber.这个字符串的内容不能表示一个正确的数字时,tonumber将返回nil

        line=io.read() ----读取一行

        n=tonumber(line) ---尝试将他转换为一个数字

        if n==nil then error(line .. " is not a valid number")

        else 

          print(n*2)

        end

        5)  若要将一个数字转换成字符串,可以调用函数 tostring,或者将该数字与一个空字符串相连接:

          print(tostring(10)=="10")  -->true

          print(10 .. "" =="10")    --true

        6)  在lua 5. 中,可以在字符串前放置操作符”#" ,来获得该字符串的长度:

          a="hello"

          print(#a)  -->5

          print(#"good\0byte")  -->8

       2.5 table(表)

        table类型实现了”关联数组“。"关联数组” 是一种具有特殊索引方式的数组,可以用除了nil之外的任何类型来索引它。

        table没有固定大小,动态类

        Lua也是通过table来表示模块,包,和对象的。当输入io.read的时候,其含义是“io模块中的read函数”。对于Lua而言,这表示“使用字符串read作为key,来索引table io.

        table的创建是通过”构造表达式“完成的,最简单的构造表达式就是{}

        table永远是”匿名的“,一个持有table的变量与table自身之间没有固定的关联性

        当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终会删除该table,并复用它的内存

          当table的摸个元素没有初始化时,他的内容就为nil

        例如:

          a.x=10   --->等同于a["x"]=10

          print(a.x)  -->等同于print(a["x"])

        --打印所有的行

          for i=1, #a do

            print(a[i])

          end

        

        一下是几种,长度操作符在Lua中的习惯写法

        print(a[#a]) --->打印列表a的最后一个值

        a[#a]=nil  -->删除最后一个值

        a[#a+1]=v   -->将v添加到列表末尾

        另一种方法来读取一个文件的前10行

          a={}

          for i=1, 10 do

            a[#a+1]=io.read()

          end

        

        

      

  • 相关阅读:
    Linux下通过C++码来操作MySQL数据库
    Linux TCP/IP 实例
    Linux UDP C/S例子
    memcached: error while loading shared libraries: libevent-2.0.so.5: cannot o解决
    /etc/profile和/root/.bash_profile有什么区别
    双Y轴柱线结合图(FusionChart)
    分组柱状图(FusionChart)
    远程过程调用(RPC)
    软件系统开发中的数据交换协议
    RPC 远程过程调用协议
  • 原文地址:https://www.cnblogs.com/finger/p/2485469.html
Copyright © 2011-2022 走看看