我和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\n", 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並非一見鍾情,但我們卻相信日久生情!!!

   在最無能為力的時候,卻遇到了最想照顧一生的那個人。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM