• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評論 - 14, 引用 - 0
            數據加載中……

            LUA要點筆記<一>

            摘自《Programming in LUA》,著重選一些特點。PS:誰能提供一本實例教程?
            全局變量不需要聲明,給一個變量賦值后即創建了這個全局變量,訪問一個沒有初
            始化的全局變量也不會出錯,只不過得到的結果是:nil.

            -e:直接將命令傳入Lua
            prompt> lua -e "print(math.sin(12))"  --> -0.53657291800043
            -l:加載一個文件.
            -i:進入交互模式.

            第2 章  類型和值
            Lua 是動態類型語言,變量不要類型定義。Lua 中有8 個基本類型分別為:nil、boolean、
            number、string、userdata、function、thread 和table。函數type 可以測試給定變量或者值
            的類型。

            兩個取值false 和true。但要注意Lua 中所有的值都可以作為條件。在控制結構的條
            件中除了false 和nil 為假,其他值都為真。所以Lua 認為0 和空串都是真。

            第3 章  表達式

            a and b      -- 如果a為false,則返回a,否則返回b
            a or  b       -- 如果a為true,則返回a,否則返回b

            一個很實用的技巧:如果x 為false 或者nil 則給x 賦初始值v
            x = x or v
            等價于
            if not x then
               x = v
            end
            and 的優先級比or 高。

            not 的結果一直返回false 或者true
            print(not nil)         --> true


            邏輯運算符認為false 和nil 是假(false),其他為真,0 也是true.
            and 和or 的運算結果不是true 和false,而是和它的兩個操作數相關。
            a and b      -- 如果a為false,則返回a,否則返回b
            a or  b       -- 如果a為true,則返回a,否則返回b
            例如:
            print(4 and 5)         --> 5
            print(nil and 13)       --> nil
            print(false and 13)     --> false
            print(4 or 5)          --> 4
            print(false or 5)       --> 5
            一個很實用的技巧:如果x 為false 或者nil 則給x 賦初始值v
            x = x or v
            等價于
            if not x then
               x = v
            end
            and 的優先級比or 高。
             
            C 語言中的三元運算符
            a ? b : c
            在Lua 中可以這樣實現:
            (a and b) or c
             
            not 的結果一直返回false 或者true
            print(not nil)         --> true
            print(not false)        --> true
            print(not 0)           --> false
            print(not not nil)      --> false

            連連接接運運算算符符 
            ..        --兩個點
            字符串連接,如果操作數為數字,Lua 將數字轉成字符串。
            print("Hello " .. "World")     --> Hello World
            print(0 .. 1)                --> 01

            w = {x=0, y=0, label="console"}
            x = {sin(0), sin(1), sin(2)}
            w[1] = "another field"
            x.f = w
            print(w["x"])    --> 0
            print(w[1])      --> another field
            print(x.f[1])    --> another field
            w.x = nil        -- remove field "x"


            在構造函數中域分隔符逗號(",")可以用分號(";")替代,通常我們使用分號用來
            分割不同類型的表元素。
            {x=10, y=45; "one", "two", "three"}
            print(not false)        --> true
            print(not 0)           --> false
            print(not not nil)      --> false

            第4 章  基本語法
            Lua  可以對多個變量同時賦值,變量列表和值列表的各個元素用逗號分開,賦值語
            句右邊的值會依次賦給左邊的變量。
            a, b = 10, 2*x      <-->      a=10; b=2*x

            遇到賦值語句Lua 會先計算右邊所有的值然后再執行賦值操作,所以我們可以這樣
            進行交換變量的值:
            x, y = y, x                  -- swap 'x' for 'y'
            a[i], a[j] = a[j], a[i]        -- swap 'a[i]' for 'a[i]'

            當變量個數和值的個數不一致時,Lua 會一直以變量個數為基礎采取以下策略:
            a. 變量個數>值的個數          按變量個數補足nil
            b. 變量個數<值的個數          多余的值會被忽略
            例如:
            a, b, c = 0, 1 
            print(a,b,c)           --> 0   1   nil
             
            a, b = a+1, b+1, b+2    -- value of b+2 is ignored
            print(a,b)             --> 1   2
             
            a, b, c = 0
            print(a,b,c)           --> 0   nil   nil

            多值賦值經常用來交換變量,或將函數調用返回給變量:
            a, b = f()
            f()返回兩個值,第一個賦給a,第二個賦給b。

            我們給block 劃定一個明確的界限:do..end 內的部分。

            控制結構的條件表達式結果可以是任何值,Lua 認為false 和nil 為假,其他值為真。

            repeat-until 語句:
            repeat
               statements;
            until conditions;

            有時候為了調試或者其他目的需要在block 的中間使用return 或者break,可以顯式
            的使用do..end 來實現:
            function foo ()
               return          --<< SYNTAX ERROR
               -- 'return' is the last statement in the next block
               do return end       -- OK
               ...             -- statements not reached
            end

            調用函數的時候,如果參數列表為空,必須使用()表明是函數調用。
            print(8*9, 9/8)
            a = math.sin(3) + math.cos(10)
            print(os.date())
            上述規則有一個例外,當函數只有一個參數并且這個參數是字符串或者表構造的時
            候,()是可選的:
            print "Hello World"     <-->      print("Hello World")
            dofile 'a.lua'         <-->      dofile ('a.lua')
            print [[a multi-line    <-->      print([[a multi-line
                     message]]                       message]])
            f{x=10, y=20}          <-->      f({x=10, y=20})
            type{}                <-->      type({})

            Lua 函數實參和形參的匹配與賦值語句類似,多余部分被忽略,缺少部分用nil 補足。
            function f(a, b) return a or b end
             
            CALL            PARAMETERS
             
            f(3)            a=3, b=nil
            f(3, 4)         a=3, b=4
            f(3, 4, 5)       a=3, b=4  (5 is discarded)

            Lua 函數中,在return 后列出要返回的值得列表即可返回多值,如:
            function maximum (a)
               local mi = 1           -- maximum index
               local m = a[mi]        -- maximum value
               for i,val in ipairs(a) do
                  if val > m then
                     mi = i
                     m = val
                  end
               end
               return m, mi
            end
             
            print(maximum({8,10,23,12,5}))     --> 23   3
            Lua  總是調整函數返回值的個數去適用調用環境,當作為一個語句調用函數時,所
            有返回值被忽略。假設有如下三個函數:
            function foo0 () end                -- returns no results
            function foo1 () return 'a' end       -- returns 1 result
            function foo2 () return 'a','b' end   -- returns 2 results
            第一,當作為表達式調用函數時,有以下幾種情況:
            1.  當調用作為表達式最后一個參數或者僅有一個參數時,根據變量個數函數盡可能
            多地返回多個值,不足補nil,超出舍去。
            2.  其他情況下,函數調用僅返回第一個值(如果沒有返回值為nil)
            x,y = foo2()           -- x='a', y='b'
            x = foo2()             -- x='a', 'b' is discarded
            x,y,z = 10,foo2()       -- x=10, y='a', z='b'
             
            x,y = foo0()           -- x=nil, y=nil
            x,y = foo1()           -- x='a', y=nil
            x,y,z = foo2()         -- x='a', y='b', z=nil
            x,y = foo2(), 20        -- x='a', y=20
            x,y = foo0(), 20, 30    -- x='nil', y=20, 30 is discarded
            第二,函數調用作為函數參數被調用時,和多值賦值是相同。
            print(foo0())          -->
            print(foo1())          --> a
            print(foo2())          --> a   b
            print(foo2(), 1)        --> a   1
            print(foo2() .. "x")    --> ax
            第三,函數調用在表構造函數中初始化時,和多值賦值時相同。
            a = {foo0()}           -- a = {}    (an empty table)
            a = {foo1()}           -- a = {'a'}
            a = {foo2()}           -- a = {'a', 'b'}
             
            a = {foo0(), foo2(), 4}  -- a[1] = nil, a[2] = 'a', a[3] = 4
            另外,return f()這種類型的返回f()返回的所有值
            function foo (i)
               if i == 0 then return foo0()
               elseif i == 1 then return foo1()
               elseif i == 2 then return foo2()
               end
            end
             
            print(foo(1))       --> a
            print(foo(2))       --> a  b
            print(foo(0))       -- (no results)
            print(foo(3))       -- (no results)
            可以使用圓括號強制使調用返回一個值。
            print((foo0()))     --> nil
            print((foo1()))     --> a
            print((foo2()))     --> a

            posted on 2009-02-26 16:15 Code Knight 閱讀(884) 評論(0)  編輯 收藏 引用 所屬分類: 腳本

            日韩亚洲国产综合久久久| 狠狠人妻久久久久久综合| 大香伊人久久精品一区二区| 日韩亚洲国产综合久久久| 精品久久久无码人妻中文字幕| 久久久久亚洲精品日久生情| 国产一久久香蕉国产线看观看| 91精品国产高清久久久久久91| 欧美午夜精品久久久久久浪潮| 亚洲精品无码久久久久AV麻豆| 久久精品国产亚洲AV香蕉| 国内精品免费久久影院| 色综合久久无码中文字幕| 99久久精品国产综合一区| 99久久精品国产一区二区 | 欧美日韩久久中文字幕| 精品久久一区二区| 综合久久精品色| 久久精品国产精品亚洲| 99久久免费国产精精品| 性欧美大战久久久久久久久 | 国内精品九九久久久精品| 久久久久免费视频| 久久成人精品视频| www性久久久com| 国内精品综合久久久40p| 久久久久久久久久免免费精品| 久久婷婷综合中文字幕| 精品久久久久久久无码| 三上悠亚久久精品| 久久久久久久精品成人热色戒 | 蜜臀av性久久久久蜜臀aⅴ| 色综合久久天天综线观看| 久久久国产精华液| 精品久久久久一区二区三区| 久久久久综合网久久| 国产欧美久久久精品| 日本精品久久久久中文字幕8| 久久精品国产一区| 久久午夜电影网| 色诱久久av|