lua學習之入門(二)----基礎語法1
轉自:http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82640.html
1、lua學習之入門(一)----環境搭建
2、lua學習之入門(二)----基礎語法1
3、lua學習之入門(二)----基礎語法2
4、lua學習之入門(三)----函式
學習LUA第6個小時了,這是第2篇文章,也是我今天學習的最後總結了,LUA我也是個初學者,我目標只是想盡可能的把自己學習的一些想法表現出來.可能寫的沒有那些大蝦們好,大蝦們的生動.但至少是我個人的寫作,本人很不喜歡轉載的,轉載不如直接去別人BLOG看..再一次宣告..我是LUA初學者,一個初學者寫給初學者的....廢話不說..入正題.
任何語言,首先要明白的是 識別符號 的命名規則,LUA的規則和C語言的沒太大分別都是由:字母,數字,下劃線組成,而且不能以數字開頭..貌似我會的程式語言都是這樣的規定.. 這個沒啥技術難度....靠死記的..
LUA的字串表示是可以用單引號或者雙引號的...這點跟JAVASCRIPT是一樣的,
在LUA手冊裡有一段這樣的東西
a = ' alo\n123" '
a = " alo\n123\ ""
a = ' \97lo\10\04923" '
a = [[alo
123 " ]]
a = [ == [
alo
123 " ]==]
手冊裡的解釋是這樣的a = " alo\n123\ ""
a = ' \97lo\10\04923" '
a = [[alo
123 " ]]
a = [ == [
alo
123 " ]==]
字串還可以用一種長括號括起來的方式定義。我們把兩個正的方括號間插入 n 個等號定義為第 n 級正長括號。就是說,0 級正的長括號寫作 [[ ,一級正的長括號寫作 [=[ ,如此等等。反的長擴充套件也作類似定義;舉個例子,4 級反的長括號寫作 ]====] 。一個長字串可以由任何一級的正的長括號開始,而由第一個碰到的同級反的長括號結束。整個詞法分析過程將不受分行限制,不處理任何轉意符,並且忽略掉任何不同級別的長括號。這種方式描述的字串可以包含任何東西,當然特定級別的反長括號除外。
另一個約定是,當正的長括號後面立即跟了一個換行符,這個換行符就不包含在這個字串內。舉個例子,假設一個系統使用 ASCII 碼(這時,'a' 編碼為 97 ,換行符編碼為 10 ,'1' 編碼為 49 ),下面五種方式描述了完全相同的字串:
另一個約定是,當正的長括號後面立即跟了一個換行符,這個換行符就不包含在這個字串內。舉個例子,假設一個系統使用 ASCII 碼(這時,'a' 編碼為 97 ,換行符編碼為 10 ,'1' 編碼為 49 ),下面五種方式描述了完全相同的字串:
很彆扭啊手冊裡的介紹是這個a所代表的字串顯示都是一樣的...感覺犯暈啊...
手冊例子想表達的意思我解析一下,
a = 'alo\n123"' 這個字串是用單引號括起來的,123後面跟了個".....想表達的意思就是說,如果用單引號作為字串的引用的話,內部的雙引號做雙引號處理,
a = "alo\n123\"" 這個字串則是用雙引號括起來的,為了解決衝突,就要使用轉義字元\"去代表"
a = '\97lo\10\04923"' 這個其實就是ASCII碼轉義而已..
最令人犯暈的是下面..
a = [==[
alo
123"]==]
這個想表達啥呢?其實這個作用和C#裡的@""有點類似..有點像格式輸出吧,,alo
123"]==]
裡面的思想有個靈活的配對,"[[" 在手冊裡有個名字,叫長括號,而在"[==["中間的等號個數代表多少級的長括號,沒有等號為0級,1個等號為1級,類推下去.
開始在程式碼裡,我以為這裡"級"的意義在於這個字串佔多少行的意思,但是經過我程式碼的測試原來沒任何關係..
依照我這個初學者的猜測...設定這些的意義,目的就是一個避免字串內過多的使用轉義字元吧,LUA的目標是要做嵌入指令碼語言,
例如有個遊戲的對白,
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"
將以上字元牛說:"不牛"
牛說:"]]"
小孩說:"]=]"
a=[==[
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"]==]
這樣在[==[裡就可以使用任何的字串表達符,提供了更大的靈活性.
後來我諮詢了下LUA高手他給我的答覆如下
這個是5.1版本新加的功能,我想主要的作用是遮蔽轉義字元的作用的,在5.0的時候,我們寫lua都需要自己可意去迴避一些轉義字元..這個只是我個人想法,你可以問問其他人,目前我實際應用的開發都是5.0居多,這個是5.1新加的,我也不是很確定,但照字面意思..就算不全對,也差不多了
看來我的猜想是正確的.
變數
LUA稱為指令碼語言,那麼就註定了他的變數是弱型別的,就是說變數沒有型別,至少我認識的指令碼語言JAVASCRIPT就是沒型別的.所以姑且把指令碼語言定義為變數沒有型別的語言就是指令碼語言...(某XX教授:你丫的亂下定義誤人子弟!..純粹是幫助記憶...別教真...別教真).
變數沒有型別,有型別的只是值 (指令碼語言的特點)
Lua 中有八種基本型別: nil, boolean, number, string, function, userdata, thread, and table. Nil 型別只有一種值 nil ,它的主要用途用於標表識和別的任何值的差異;通常,當需要描述一個無意義的值時會用到它。 Boolean 型別只有兩種值:false 和 true。 nil 和 false 都能導致條件為假;而另外所有的值都被當作真。 Number 表示實數(雙精度浮點數)。(編譯一個其它內部數字型別的 Lua 直譯器是件很容易的事;比如把內部數字型別改作單精度浮點數或長整型。參見檔案 luaconf.h 。) String 表示一串字元的陣列。 Lua 是 8-bit clean 的:字串可以包含任何 8 位字元,包括零結束符 ('\0')
userdata 型別用來將任意 C 資料儲存在 Lua 變數中。這個型別相當於一塊原生的記憶體,除了賦值和相同性判斷,Lua 沒有為之預定義任何操作。然而,通過使用 metatable (元表) ,程式設計師可以為 userdata 自定義一組操作. userdata 不能在 Lua 中建立出來,也不能在 Lua 中修改。這樣的操作只能通過 C API。這一點保證了宿主程式完全掌管其中的資料。
大家都知道,C語言裡有幾個特別的資料構造,例如,結構體,共用體等,這個userdata 型別其實就滿足結構體傳值的功能的資料型別,至少我現在是這樣理解的..至於元表我還沒有接觸,暫時將userdata 型別等同於一個只讀型別.
Lua 中有三類變數:全域性變數,區域性變數,還有 table 的域。 其實今天大多的時候都花費在字串裡,但是一種語言來說,字元也是一個很重要的重點,例如C#基本提供了每個類都是 ToString()方法,C語言,單獨用一章介紹字串,資料結構裡也獨立一個章專門說字串,所以這個字串是在我們日常開發中經常用到的,對它理解得深其實是有好處的...今天就到這裡
明鏡臺
相關文章
- Java學習之基礎語法Java
- Java學習之基礎語法練習Java
- Scala學習 1.1 Scala基礎與語法入門實戰
- Lua語法基礎教程(上篇)
- Erlang學習筆記(二)Erlang基礎語法之If、Case的使用筆記
- Go學習筆記 - Go 基礎語法(1)Go筆記
- PL/SQL基礎語法入門SQL
- redis學習(八) Lua語法Redis
- 學習Rust 基礎語法Rust
- markdown學習(基礎語法)
- Linux入門學習(1基礎操作命令)Linux
- 新手入門之——Linux學習基礎(轉)Linux
- 1、Lua 基礎
- lua 基礎 1
- python 基礎習題1--基礎語法Python
- Python 3 學習筆記之——基礎語法Python筆記
- Flutter學習之Dart語法(二)FlutterDart
- 初學Python(1)基礎語法Python
- JDK學習基礎入門(一)JDK
- mysql 基礎命令入門學習MySql
- Swift程式語言教程-001入門學習基礎Swift
- go 學習記錄--基礎語法Go
- Java學習--jsp基礎語法JavaJS
- Hive學習筆記:基礎語法Hive筆記
- 菜鳥學習筆記:Java基礎篇1(基礎語法、物件導向)筆記Java物件
- 重學ES6基礎語法(二)
- Linux 學習基礎入門之Linux分割槽Linux
- Shell程式設計基礎學習之六:sed 入門程式設計
- Esper學習之六:EPL語法(二)
- Java基礎語法1Java
- Swift基礎語法[ 1 ]Swift
- 【C基礎語法】1
- Gradle入門系列(一)——groovy基礎語法Gradle
- javascript快速入門7--ECMAScript語法基礎JavaScript
- 0基礎lua學習(十四)封裝封裝
- java入門基礎學習----泛型Java泛型
- node 學習筆記 基礎入門筆記
- Oracle學習快速入門基礎教程Oracle