解析Lua與其他程序語言語法不同之處
Lua與其他程序語言語法不同之處是本文要介紹的內(nèi)容,主要是從LUA與其他程序語言的不同之處來學習LUA腳本語言的使用,具體內(nèi)容來看本文詳解。
變量無需聲明類型(variable type), 無需在首次使用前聲明
以下語句是用C語言書寫的.
- int i;
- i = 9;
- printf("%d\n",i);
類似的行為在Lua中的語句是這樣的:
- > i = 9
- > print(i)
- 9
不需要事先聲明i及其類型, 可以直接使用
此外, 變量的類型也不是固定的, 是由其當前值決定的. 可以隨時賦不同類型的值給同一個變量.
- > i = 9
- > print(i)
- 9
- > i = "Hello Azeroth!"
- > print(i)
- Hello Azeroth!
不過, 雖然使用時不需要指明, 但變量類型是存在的, 包括: number, string, Boolean, function, table, nil, thread, userdata
可以通過type語句取得類型, 如:
- > print(type("Hello Azeroth!"))
- string
支持為多個變量同時賦值
可使用以下的方法, 一一對應賦值:
- > x, y = 3, 5
- > print(x * y)
- 15
[ 非的邏輯運算符是~而非! ]
- > print(1 ~= 3)
- true
^ 運算符為冪運算而非異或運算
即:
- > print(13^2)
將得到169.
字符串的操作
可以很方便地使用tostring() / tonumber()函數(shù)進行字符串與數(shù)字類型的轉(zhuǎn)換, 支持科學記數(shù)法.
- > x = tonumber("1e3")
- > print(x)
- 1000
提供運算符 ".." 用于連接字符串, 如:
- > x = "a" .. "b"
- > print(x)
- ab
Lua除支持雙引號("")表示字符串外, 也支持用單引號('')或方括號([[]]), 以應付不同的場合, 特別是當字符串中包含有", ', ]時:
- > x = 'Hello'
- > print(x)
- Hello
- > x = 'Isn't it nice?'
- stdin:1: '=' expected near 'it'
此句出錯; Lua認為字符串是'Isn', 從而無法解讀后面的部分; 一種解法是使用轉(zhuǎn)義符. Lua和其他語言一樣支持轉(zhuǎn)義符:
- > x = 'Isn\'t it nice?'
- > print(x)
- Isn't it nice?
或使用方括號:
- > x = [[This is a long string including ' and "]]
- > print(x)
- This is a long stirng including ' and "
方括號的配對規(guī)則是: [==..=[ 字符串內(nèi)容 ]==..=], 在[ [之間可以沒有等號(上面的情形), 或者有任意數(shù)量的等號, 配對時將尋找包含相同數(shù)量等號的] ]. 例如, 可以用下面的方式在字符串中包含]]:
- > x = [==[This is a long string including ', ]] and "]==]
- > print(x)
- This is a long string including ', ]] and "
方括號還支援多行字符串。
字符串長度的取法和C Shell取Table長度類似, 使用"#"運算符:
- > print(#"Hello")
- 5
或者用函數(shù)string.len():
- > x = "Hello"
- > print(string.len(x))
- 5
邏輯運算的特殊現(xiàn)象
看這個語句:
- > print(true and 4)
- 4
這個結(jié)果有別于其他語言, 比如C或者C++; 后者在同樣的情況下會輸出true(因為非0值都被當作真處理).
先來看這個問題: 在普通的邏輯表達式A and B中, 明顯的, 如果第一個, 也就是A為真, 那么表達式的值是由B決定的; 即是說, A and B, 若A為真, 那么B真則表達式A and B為真, B假則表達式A and B為假.
所以Lua做出這樣處理的依據(jù)是: true and 4是一個邏輯與(A and B)的表達式, 由于第一個的值為真, 表達式的值是其實是由第二個決定的; 換言之, 只要直接返回第二個表達式的值就行了. Lua的推廣是, 第二個表達式即使不產(chǎn)生true或false的布爾值, 也可以被返回.
利用這樣的運算特性, 可以在Lua內(nèi)達到C/C++中a ? b : c語句的效果:
- > print(true and "Hello" or "Azeroth!")
- Hello
- > print(false and "Hello" or "Azeroth!")
- Azeroth
換言之,C/C++中的"a ? b : c"語句在Lua中可以寫為a and b or c.
但是這個寫法是有缺陷的. 在a and b or c中, 通常a是邏輯表達式, b和c不會是表達式, 首先運算a and b, 然后是(a and b) or c. 正常情況下, 若a為真, a and b會返回b, 如果b是一個字串或數(shù)值, 它就是'真', 因此b or c會直接返回b, 符合預期的"a為真, 返回b"的設計.
但如果b是一個變量, 而該變量恰好為空(如尚未定義)時, b為假, b or c就會返回c. 此時產(chǎn)生了"a為真, 但返回c"的情況.
因此為了使表達式a and b or c正常工作, 必須保證b為真. 在不能保證b為真的情況下, 只有用if-else語句才能保證邏輯嚴密性.
(參考: 有關(guān)lua中"(a and b) or c"與C中"a?b:c"等同的條件, by carl2500 from CWDG)
變量的作用范圍
在Lua中可以手動劃分代碼塊, 使用的是do-end語句:
- > do
- >> local i = 10
- >> print(i)
- >> end
- 10
- > print(i)
- nil
和其它的程序語言使用{ }的區(qū)別不大.
小結(jié):解析Lua與其他程序語言語法不同之處的內(nèi)容介紹完了,希望通過本文的學習能對你有所幫助!