lua學習之語句篇

語句

賦值

  1. 修改一個變量或者修改 table 中的一個字段的值
  2. 多重賦值,lua 先對等號右邊的全部元素進行求值,而後再賦值
  3. 值的個數小於變量的個數,那麼多餘的變量就置爲 nil
  4. 初始化變量,應該爲每個變量賦一個初始值
  5. 收集函數的多個返回值
x,y = y,x --變量交換
a[i], a[j] = a[j], a[i]
-- 值的個數小於變量的個數
x, y, z = 1, 5 -- z = nil
x, y = 1, 5, 8 -- x = 1, y = 5

局部變量與塊

  1. local 建立局部變量
  2. 局部變量做用域僅限於聲明他們的
  3. 一個就是一個控制結構的執行體,或函數的執行體,或程序塊
x = 10
local i = 1
while i < x do
   local x = i * 2
   print(x) -- 2, 4, 6 ...
    i = i + 1
end
print(x)  -- 10
if i > 20 then
    local x 
    x = 20
    print(x + 2) -- 22
else
   print(x) -- 10 
end
print(x) -- 10

交互模式將每一行理解爲一個程序塊,並當即執行,可能結果會不一樣數組

顯式的界定一個塊函數

do
    -- code block
end

儘可能使用局部變量測試

  1. 訪問局部變量要快於全局變量
  2. 避免污染全局環境
  3. 局部變量一般會隨這其做用域的失效而消失,便於垃圾收集器釋放
  4. lua 將局部變量的聲明看成語句處理,可在任何容許輸入語句的狀況下,輸入局部變量的聲明
  5. 所聲明的局部變量的做用域從聲明語句開始直至所在塊的結束
  6. 聲明可包含初始化賦值
  7. 多重賦值時,額外的值會被丟棄,額外的變量置爲 nil
  8. 沒有被賦值的會被置爲 nil
-- 習慣寫法
local foo = foo -- 全局變量 foo 的值賦給局部變量 foo, 用來保存全局變量的值

控制結構

  1. if, elseif, for, while 顯式的終止符爲 end
  2. repeat 顯式的終止符爲 until
  3. 控制結構中的條件表達式能夠是任何值

iflua

if 條件表達式 then else end
if a < 0 then
    a = 0
end
if a < b then
    return a
else
    return b
end

-- lua 不支持 switch 
if op == "+" then
    r = a + b
elseif op == "-" then
    r = a - b
elseif op == "*" then
    r = a * b
elseif op == "/" then
    r = a / b
else
    error("invalid operation")
end

whilecode

  1. 測試 while 條件,若是爲,循環就結束
  2. 不然就執行循環體並重復這一過程
local i = 1
while a[i] do
    print(a[i])
    i = i + 1
end

repeat...until索引

  1. 一直執行循環體,直到條件爲時結束
repeat
    line = io.read()
until line ~= ""
  1. 在 lua 中一個聲明
  2. 在循環體中局部變量的做用域包含了條件測試
-- 這在 lua 中是能夠執行的
local sqr = x / 2
repeat
    sqr = (sqr + x / sqr) / 2
    local error = math.abs(sqr ^ 2 - x)
until error < x / 10000

數值型 forip

  1. 變量 var 從 exp1 變化到 exp2 ,每次變化以 exp3 爲步長(遞增並執行一次執行體)
  2. exp 是可選的,默認爲 1
for var = exp1, exp2, exp3 do
    -- 執行體
end

for i = 10, 1, -1 do
    print(i) -- 10, 9, 8,...
end

for 的細節作用域

  1. 循環的三個表達式是在循環開始前一次性求值的
  2. 控制變量會被自動的聲明爲 for 語句的局部變量,並在循環體內可見
  3. 控制變量在循環結束後就不存在了
  4. 若是須要在循環結束後訪問控制變量,必須將控制變量的值保存在另外一個變量中
  5. 不要在循環過程當中修改控制變量的值
  6. 可以使用 break 語句在 for 正常結束前提早結束它

泛型 for字符串

  1. 經過迭代器函數遍歷全部的值
  2. ipairs() 用來遍歷數組
  3. 在每次循環中 i 都會被賦予一個新的索引值,v 會被賦予一個對應於該索引的元素值
for i,v in ipairs(a) do
    print(v)
end

-- 打印 table 中的 key 值
for k, in pairs(t) do
   print(k) 
end

二種 for 類型的共同點it

  1. 循環變量都是循環體的局部變量
  2. 不該該對循環變量進行賦值
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
-- 將名稱轉換成它在一週中的位置,索引爲字符串,值爲對應的位置,方便查找,逆向 table
revDays = {["Sunday"] = 1, ["Monday"] = 2 ,["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7}
x = "Tuesday"
print(revDays[x]) -- 3 打印 Tuesday 的位置
revDays = {}
for k,v in pairs(days) do
    revDays[v] = k
end

break 與 return

  1. 都用於跳出當前塊
  2. break 用於結束一個循環,只會跳出包含它的內層循環,而不會跳出外層循環
  3. 執行 break 後,會在跳出的外層循環中繼續執行
  4. return 用於函數返回結果或簡單的結束函數的執行
  5. 任何函數的結尾處實際上都有一句隱式的 return
  6. 若是函數沒有值須要返回的話,須要在其結尾處添加 return 語句
  7. break 和 return 只能是一個塊的最後一條語句(應該是程序塊的最後一條語句如:end, else, until 前的一條語句)
  8. 由於 return 或 break 後的語句將沒法執行到
local i = 1
while a[i] do
    if a[i] == v then 
        break  -- 條件語句塊中的最後一條語句
    end
    i = i + 1
end
相關文章
相關標籤/搜索