• 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)


      Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数。

    在目前的脚本引擎中,Lua的速度是最快的。。。

      Lua可直接在EditPlus文本处理器上开发,只需搭建相应的开发环境即可。GO GO GO

      先说说我和Lua是如何相识的吧*^-^*。。。

      故事的开始是这样滴。。。在一个阳光明媚的。。。。我来。。。就在公司认识了Lua。。。

    然后我们就开始了一段刻苦铭心的。。。和白首到老的XIN

      为什么我要选择学Lua???很简单。。。起初是因为公司需要。。。在慢慢的接触过程中。。。

    发现Lua原来是这么的耐人寻味。。。

    就好比爱情,,,可以是一见钟情的 、也可以是日久生情的。。。Lua可能更适合和我细水长流了吧!!!

      一见钟情是因为被外表吸引,日久生情就是对对方内心世界的阅读与欣赏了。。。

      一见钟情并不一定是长久的。。。也许大概可能会随着岁月的流逝越发平淡。。。

    反而日久生情却可以成就白首的一生。。。一见钟情的最终也是最好归宿就是日久生情。。。

    所以。。。虽然我和Lua的开始并不是所谓的完美。。。但是我们会为了奔向完美的结局而努力滴。。。

      既然都已经在一起了。。。之间的磕磕绊绊是在所难免的。。。所以如果你看出我们之间存在的问题。。。

    麻烦帮我们纠正。。。为了我和Lua的天长地久在此先行谢过了。。。*^_^* *^_^* *^_^*

    一、Lua中的一些特殊字符

      1、单行注释  --注释内容; 多行注释  --[[ 注释内容 ]]

      2、使用#来计算字符串的长度。

        str = "www.baidu.com"
        print(#str)

        输出:13

      3、..用来连接两个字符串 

        str1 = "hello"
        str2 = "world"
        print(str1 .. ' ' .. str2)

          输出:hello world

      4、不等号是~=而不是!=

        print(10 ~= 10)
        print(10 ~= 3)

        程序运行输出:

    ---------- 新建程序 ----------
    false
    true
    
    输出完成 (耗时 0 秒) - 正常终止

       5、字符串可用单引号、双引号和[[ ]]来表示

        str1 = "java"
        str2 = 'lua'
        str3 = ""hello""
        str4 = [[world]]

        程序运行输出:

    ---------- 新建程序 ----------
    java
    lua
    "hello"
    world
    
    输出完成 (耗时 0 秒) - 正常终止

    二、Lua字符串操作

       1、gsub方法:l为被替换字符,m为要替换的字符,2为替换的次数,不写默认为全部替换

        --输出:hemmo world java lua    2
        print(string.gsub("hello world java lua", "l", "m", 2))

       2、find方法:Java为要查找的字符串,1是索引,即查找从索引1开始查起,不存在则返回nil

        --输出:13    16
        print(string.find("hello world java lua", "java", 1))

       3、reverse方法:反转字符串; upper/lower方法:大小写转换; len方法:计算字符串长度

        rep方法:返回字符串的n个拷贝; format方法:格式化字符串

        --输出:aul
        print(string.reverse("lua"))
    
        --输出:LUA
        print(string.upper("Lua"))
    
        --输出:lua
        print(string.lower("Lua"))
    
        --输出:3
        print(string.len("lua"))
    
        --输出:lualualua
        print(string.rep("lua", 3))
    
        --输出:日期格式化:2016/04/07
        year = 2016; month = 4; day = 7
        print(string.format("日期格式化:%04d/%02d/%02d", year, month, day))

        对%04d做一个补充:04代表整数不足4位左边用0补齐。

    三、Lua知识点储备

      1、Lua中的8中基本类型:

        nil、number、boolean、string、userdata、thread、table,function 

       2、在默认情况下,变量总是认为是全局变量,局部变量的定义用local关键字修饰

        删除一个全局变量,只需将变量赋值为nil即可。EG:a = nil

       3、遍历输出1-10,Lua循环使用语法介绍

        for遍历:

        for i = 1, 10 do
            if i == 5 then
              print('is:' .. i)
            else
              print(i)
            end
        end

         while遍历:

        local n = 0
        while true do
            n = n + 1
            if n > 10 then
              break
            else
              print(n)
            end
        end

        repeat...until遍历

        local n = 0
        repeat
            n = n + 1
            io.write(n .. ' ')
        until n >= 10

        if...else判断语句语法

        num = 3;
    
        if num > 10 then
            print("> 10")
        elseif num == 10 then
            print("== 10")
        else
            print("< 10")
        end

      如果不想控制每次打印都换行,可将print(n)替换为io.write(n .. ' ')

       4、两变量交换值

        x, y = 10, 20
        x , y = y, x
        print("x=" .. x .. ' y=' .. y)

        程序运行输出:x=20 y=10

      5、全局变量与局部变量

        在Lua中,如果没有用关键字local修饰,全都视为全局变量。

        Lua是用Table(表)来管理全局变量的。把所有的全局变量都存储在一个叫'_G'的表中。。。

        local num = 30
        str = "hello lua"
        print(_G.num)    --访问全局变量num,因为num被定义为局部变量。所以输出为nil
        print(_G.str)    --访问全局变量str

        程序运行输出:

    ---------- 新建程序 ----------
    nil
    hello lua
    
    输出完成 (耗时 0 秒) - 正常终止

    四、Lua中的table(表)用法

      Lua中的table其实就是key-value键值对形式的数据结构。长的和java里的HashMap像极了。。。

      初始化表:myTable = {}

      --数组形式  
      myTable = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thurday", "Friday", "Saturday"}   for index in pairs(myTable) do    io.write(myTable[index] .. ' ')   end   print("第一个元素:" .. myTable[1])

      程序运行输出:

    ---------- 新建程序 ----------
    Sunday Monday Tuesday Wednesday Thurday Friday Saturday 第一个元素:Sunday
    
    输出完成 (耗时 0 秒) - 正常终止

       

      Lua中的数组和table

      --数组形式
      myTable = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thurday", "Friday", "Saturday"}
      --table形式。。。与数组形式是等价的
      --myTable = {[1] = "Sunday", [2] = "Monday", [3] = "Tuesday", [4] = "Wednesday", [5] = "Thurday", [6] = "Friday", [7] = "Saturday"}
    
      for index = 1, #myTable do
          io.write(myTable[index] .. ' ')
      end

        程序运行输出:

    ---------- 新建程序 ----------
    Sunday Monday Tuesday Wednesday Thurday Friday Saturday 
    输出完成 (耗时 0 秒) - 正常终止
    languges = {
        first = "java",
        second = "lua",
        third = "struts",
        fourth = "hibernate",
        fifth = "spring",
        "all"
    }
    
    print("遍历languges:")
    for k, v in pairs(languges) do
        print(k .. ':' .. v)
    end
    
    print('分析languges:')
    print("first:" .. languges["first"])
    print(languges[1])
    print(languges[2])
    print("third:" .. languges["third"])

      程序执行结果:

    遍历languges:
    1:all
    fifth:spring
    fourth:hibernate
    first:java
    third:struts
    second:lua
    分析languges:
    first:java
    all
    nil
    third:struts

     五、table用法的延伸

    courses = {
        {name="java", ip="192.168.110.187"},
        {name="lua", ip="10.3.255.8"},
        {name="jQuery", ip="192.168.110.54"},
        {name="CSS", ip="192.168.110.134"},
        {name="ORACLE", ip="10.2.255.34"},
    }
    
    --按照name对network进行排序
    table.sort(courses, function(a, b) 
        return (a.name > b.name)
    end)
    
    --遍历输出network的值
    print "排序后courses为:"
    for o in pairs(courses) do
        local temp = ''    --temp为局部变量
        for k, v in pairs(courses[o]) do
        temp = temp .. ',' .. k .. '_' .. v
        end
    --  print(string.sub(temp, 2, string.len(temp)))
    -- print(string.sub(temp, 2, #temp)) --可以根据#temp来获取temp的长度
    print(string.sub(temp, 2)) --下标从1开始算而非0 end

       程序运行输出:

    ---------- 新建程序 ----------
    排序后courses为:
    name_lua,ip_10.3.255.8
    name_java,ip_192.168.110.187
    name_jQuery,ip_192.168.110.54
    name_ORACLE,ip_10.2.255.34
    name_CSS,ip_192.168.110.134
    
    输出完成 (耗时 0 秒) - 正常终止

    六、Lua中的function(函数)用法

       1、简单的函数语法与代码实现

      function fac (n)
          if n <= 0 then
            return 1
          else
            return n * fac(n-1)
          end
      end
    
      print(fac(5))

       

      2、函数作为变量的形式

      maxNum = function(x, y)
          if x > y then 
            return x
          else
            return y
          end
      end
    
      print('maxNum=' .. maxNum(12, 6))

      程序运行输出:

    ---------- 新建程序 ----------
    maxNum=12
    
    输出完成 (耗时 0 秒) - 正常终止

      3、函数可有多个返回值

      function maxMin(arr) 
          maxNum, minNum = arr[1], arr[1]
          for index in pairs(arr) do
            if arr[index] > maxNum then
                maxNum = arr[index]
            end
    
            if arr[index] < minNum then
                minNum = arr[index]
            end
          end
          return maxNum, minNum
      end
    
      myTable = {12, 34, 3, 67, 54, 33, 87, 34}
      maxNum, minNum = maxMin(myTable)
    
      print("maxNum=" .. maxNum .. " minNum=" .. minNum)

      程序运行输出:

    ---------- 新建程序 ----------
    maxNum=87 minNum=3
    
    输出完成 (耗时 0 秒) - 正常终止

       

      4、函数中参数的个数可以是可变的

      function ave(...)
          args = {...}
          sum = 0;
        
          for i, v in ipairs(args) do
            sum = sum + v
          end
          return sum / #args
      end
    
      print(ave(12, 34, 3, 1, 54, 33, 87, 34))  --程序输出:32.25

      5、函数实现迭代器功能

      function square(iteratorMaxCount, currentNumber)
          if (currentNumber < iteratorMaxCount) then
            currentNumber = currentNumber + 1
            return currentNumber, currentNumber * currentNumber
          end
      end
    
      for index, sqr in square,5,0 do
          print(index, sqr)
      end

      程序运行输出:

    ---------- 新建程序 ----------
    1    1
    2    4
    3    9
    4    16
    5    25
    
    输出完成 (耗时 0 秒) - 正常终止

    七、Lua中的pairs和ipairs的区别

      

        subArr = {"java", "lua", "c", "c++", "jQuery"}
        userInfo = {name="zhangsan", age = 12, sex = "man", addr = "shenzhen"}
    
        --ipairs可替换为pairs
        for k,v in ipairs(subArr) do    
            print('k=' .. k .. ' v=' .. v .. ' ' .. subArr[k])
        end
    
        print()
    
        --pairs不可替换为ipairs
        for k,v in pairs(userInfo) do
            print('k=' .. k .. ' v=' .. v .. ' ' .. userInfo[k])
        end

        程序运行输出:

    ---------- 新建程序 ----------
    k=1 v=java java
    k=2 v=lua lua
    k=3 v=c c
    k=4 v=c++ c++
    k=5 v=jQuery jQuery
    
    k=age v=12 12
    k=addr v=shenzhen shenzhen
    k=name v=zhangsan zhangsan
    k=sex v=man man
    
    输出完成 (耗时 0 秒) - 正常终止

      相同程序使用pairs和ipairs输出结果的不同

    local subjects = {   
        "java",   
        "lua",   
        [3] = "c",
        [6] = "c++",
        [5] = "jQuery",
        "css",
        [7] = "jsp"
    }   
    for k, v in pairs(subjects) do  --将pairs替换为ipairs对比输出结果
        print(k, v)   
    end  

      执行结果输出:

        使用pairs的输出如下

    ---------- 新建程序 ----------
    1    java
    2    lua
    3    css
    5    jQuery
    6    c++
    7    jsp
    
    输出完成 (耗时 0 秒) - 正常终止

        使用ipairs的输出如下:

    ---------- 新建程序 ----------
    1    java
    2    lua
    3    css
    
    输出完成 (耗时 0 秒) - 正常终止

     从上面的代码执行结果可以看出:

      pairs可以遍历表中的所有key,还可以返回nil;

      ipairs不能返回nil,只能返回数字0,遇到nil程序直接退出。

    八、Lua连接MySql数据库

    require "luasql.mysql"
    --mysql = require "luasql.mysql" --写法2
    
    --创建环境对象
    env = luasql.mysql()
    --env = mysql.mysql()  --写法2
    
    --连接数据库
    conn = env:connect("lua", "root", "******", "localhost", 3306)
    --conn = env:connect(数据库名称, 账号, 密码, IP地址, 端口号)
    
    --设置数据库的编码格式
    conn:execute"SET NAMES UTF8"
    
    --执行数据库操作
    cur = conn:execute([[select * from userInfo]])
    
    --此处的a指的是以附加的方式打开只写文件
    row = cur:fetch({}, "a") 
    
    --文件对象的创建,顺便将表信息存储在userInfo.txt文本中
    file = io.open("userInfo.txt","w+");
    
    while row do
        var = string.format("%d %s %d %s
    ", row.id, row.name, row.sex, row.address)
    
        print(var)
    
        file:write(var)
    
        row = cur:fetch(row, "a")
    end
    
    
    file:close()  --关闭文件对象
    conn:close()  --关闭数据库连接
    env:close()   --关闭数据库环境

       程序运行输出:

    ---------- 新建程序 ----------
    1 zhangsan 1 shenzhen
    
    2 lisi 1 shanghai
    
    3 wangwu  0 beijing
    
    4 sunfang 0 xiamen
    
    5 linli 1 fuzhou
    
    6 zhaoliu 0 hangzhou
    
    
    输出完成 (耗时 0 秒) - 正常终止

      其中userInfo表结构设计如下:

      

       用lua进行面向对象的编程,声明方法和调用方法统一用冒号,对于属性的调用全部用点号

      今天就写这么多了。。。等实际项目开发中再进行补缺补漏了。。。

    初次接触Lua,个人感觉即不排斥也没有很高的热情。。。也许是缺乏开发经验,,,

    现在无法从实际开发项目中体会到Lua的强大吧。。。

      我和Lua并非一见钟情,但我们却相信日久生情!!!

       在最无能为力的时候,却遇到了最想照顾一生的那个人。。。

  • 相关阅读:
    PHP 7安装使用体验,升级PHP要谨慎
    PHP里10个鲜为人知但却非常有用的函数
    解决 PHPExcel 长数字串显示为科学计数
    linux安装jdk1.6
    虚拟机下Redhat9 网络配置问题(转)
    windows下的一些命令
    redis高级应用特征
    乐观锁的概念
    windows配置redis(转)
    redis常用命令
  • 原文地址:https://www.cnblogs.com/JimLy-BUG/p/5358796.html
Copyright © 2020-2023  润新知