【Lua】Lua 入門知識點總結

Lua 入門學習筆記

本教程旨在幫助有編程基礎的學習者快速入門Lua編程語言。包括Lua中變量的聲明與使用,包括全局變量和局部變量的區別,以及nil類型的概念、數值型、字符串和函數的基本操作,包括16進制表示、科學計數法、字符串連接、函數聲明與調用等。此外,還介紹了table類型及其數字下標和字符串下標的用法,包括數組型table的聲明、賦值、長度獲取以及元素操作等。最后,介紹了Lua中的全局表、真和假的定義、分支判斷語句以及三種循環語句(for循環、while循環)

建議有編程基礎的同學使用這篇文章

一、編譯環境

在線體驗LuatOS

先直接寫一個輸出

print("hello world")
  • print不是printf
  • 語句后面沒有分號

二、變量聲明與作用域

  • 默認全局變量:Lua 中直接賦值的變量默認是全局變量,跨文件可見。

  • 局部變量:使用 local 關鍵字聲明,作用域限定在當前代碼塊、函數或文件內。

  • 多變量賦值

    local a = 0
    b, c = 1, 2    -- 同時聲明 b=1, c=2
    d, e, f = 1, 2 -- c 未被賦值,值為 nil
    
    • 規則
      • 左側變量數 > 右側值時,多余變量賦 nil
      • 右側值數 > 左側變量時,多余值被忽略。

三、數據類型系統

nil 類型
  • 表示未初始化或顯式賦空值:沒有初始化的都為nil

  • 相當于C語言中的NULL類型

    local a
    print(undeclared_var) -- 輸出 nil
    
number 類型

在c語言里面數值有很多個類型,比如說int chair long float,但是在lua里面都統一叫做number數值型。

  • 統一數值類型,支持多種表示方式:

    • 十進制:123
    • 十六進制:0x1F(十進制 31)
    • 科學計數法:2e10(表示 20000000000)
  • 運算支持: lua也是支持加減乘除運算的,以及成冪符號,左移右移

    print(10 ^ 5)    -- 冪運算輸出 100000
    print(1 << 3)    -- 左移運算輸出 8
    print(8 >> 1)    -- 右移運算輸出 4
    
string 類型

字符串的聲明的話,跟c是差不多的。我們可以在lua里用雙引號來圈住一些字,表示一個字符串也可以用單引號圈出一個字,表示字符串單引號和雙引號都是可以的,而且支持轉義字符。

  • 聲明方式

    • 單引號/雙引號:支持轉義符(如 \n

    • 長字符串:[[多行文本]](保留原始格式,不轉義)

      a = "agcuiogogqWCU"
      b = 'uigdcfuwioge'
      c = [[dghoeuivfqwe 
      qiowhc1266]]
      
  • 操作

    另外在lua里面字符串的連接符號不是加號,是兩個點

    c = a..b                -- 連接運算符是兩個點
    print(#"0123456789")    -- 井號獲取長度,輸出 10
    
  • 類型轉換

    s = tostring(10)       -- 轉字符串 "10"
    n = tonumber("10")     -- 轉數值 10
    tonumber("abc")        -- 轉換失敗返回 nil
    
  • 顯示字符串長度:

    a = "agcuiogogqWCU"
    print(#a) 			   --在打印的前面加上'#'就可以顯示這個字符串的長度
    

四、函數定義與使用

函數聲明
  • 一般的聲明方式:

    function function_name(...)...-- body
    end
    
  • 兩種等效方式:

    function f(a, b) print(a, b) end
    f = function(a, b) print(a, b) end
    
參數與返回值
  • 參數處理

    • 參數不足時自動補 nil,多余參數被忽略。
  • 多返回值: 我們可以在函數里主動返回一些值,并且可以返回多個值

    function f() return 1, 2 end
    i, j = f() -- i=1, j=2
    
  • 默認返回值:無 return 時返回 nil


五、表(table)數據結構

數組型 table
  • 語法:

    • 用大括號將成員括起來 ‘{ }’

    • 用賦值 ‘=’ 賦值給變量

    • 用逗號將成員分開 ‘,’

      arr = {1,2,3,4,5}
      
  • 核心特性

    • 下標從 1 開始,支持混合類型元素(也就是說可以存數字、字符串、函數、其他的table,但要注意用 ‘,’ 隔開)。
    • 未定義元素值為 nil
    • 動態擴展——對于table中沒有定義的位置可以直接賦值
    • 自帶的接口
      • insert(【table】,【位置】,【值】)
      • remove(【table】,【位置】) ——有返回值,返回被移除的元素
  • 操作示例

    arr = {1, "two", {subtable = true}}
    print(arr[5])           -- 輸出 nil
    arr[5] = "new"          -- 動態擴展
    print(#arr)             -- 獲取長度 5
    table.insert(arr, 2, "d")  -- 插入元素
    removed = table.remove(arr, 2) -- 移除元素并返回 "d"
    
哈希表型 table
  • 字符串下標

    tbl = {key1 = 1,c = function()--.....end,["特殊符號"] = 123 		--注意中括號以及""
    }
    tbl["abc"] = "abc"
    print(tbl.key1)            -- 輸出 1(這種輸出方式需要字符串下標符合變量命名規范)
    print(tbl["特殊符號"])    	-- 輸出 123(注意是字符串,帶有"")
    
  • 未聲明鍵值返回 nil支持動態添加鍵值對

全局表 _G
  • 存儲所有全局變量

    a = 1
    print(_G["a"])
    print(_G.a)            -- 輸出 1
    print(_G.table.insert) -- 輸出函數地址
    
  • 實際上table也是一個全局變量,table這個全局變量它的類型就是table,它有一個下標叫做insert,同時table, 它因為是全局變量,所以它也在下劃線g全局表里面,就像這樣,我們打印出來發現它是一個table,而且呢,因為他也是一個table.

print(_G["table"]["insert"])

六、控制結構

邏輯運算
  • 真假規則:僅 falsenil 為假,其他值(包括 0)為真。

    a = true
    b = false
    print(1 > 2)
    print(1 < 2)
    print(1 <= 2)
    print(1 >= 2)
    print(1 == 2)
    print(1 ~= 2)
    

    注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的

    短路求值

    print(nil or 0)       -- 輸出 0(返回第一個真值)
    print(true and "yes") -- 輸出 "yes"(返回第二個操作數)
    
  • and(與) or(或) 和 not(非)

    a = true
    b = false
    print(a and b)
    print(a or b)
    print(not a)
    

    注意:

    • 在lua里有個特殊的規定,在lua里面只有false和nil代表假,其他都是真c語言里面零也代表假,但是在lua里面數字0是代表真的,因為他不是nil或者false

    • Lua里面的end or和not返回的并不是完全是false和true, lua里會直接返回a或者b的值

    • 我們可以用and和or來實現短路求值

      a = nil
      b = 0
      print(a and b)
      print(a or b)
      print(not a)
      

      運行結果:

      在這里插入圖片描述

分支判斷
  • 語法

    if 【condition】 then-- code
    elseif 【condition2】 then-- code
    else-- code
    end
    
  • 注意:

    • elseif中間沒有空格
    • 條件后面有then
    • 就像上面提到的0也是代表真
循環結構
  • for 循環

    for i = 1, 10 do  -- 倒序循環if i == 5 then break end
    end
    

    注意:

    • 循環定義了一個變量,然后給變量一個初值,再給變量定義一個結束值,下面是執行的代碼塊,這個變量是可以直接使用的。當然這個變量出了這個代碼塊之后,就沒有意義了

    • 我們還可以再加一個參數,這個參數叫做步長,就是每一次循環初值i的變化的值

    • 循環里面i在運行圖中是不能手動更改的。如果你修改了,他會默認悄悄給你在這邊新建一個變量,它新建了一個臨時變量,叫做i,你后面調用的時候會用到i,這一點和c不太一樣,它的循環是不能更改的。

      for i = 10, 1, -1 do  -- 倒序循環if i == 5 then break end
      end
      
      for i=10,i,-1 doprint(i)local i=1  -- 新建一個臨時變量--....
      end
      
  • while 循環

    n = 10
    while n > 1 don = n - 1  -- 必須顯式修改循環變量if n == 5 then break end
    end
    

    注意:lua不支持自減操作如n--n -= 1這些

七、字符串高級特性

  • 二進制安全:支持存儲空字符(0x00):

    s = string.char(0x30, 0x31, 0x32, 0x33, 0x00)
    print(#s)  -- 輸出 5(包含空字符)
    
  • 索引從 1 開始

    second = string.sub(s, 2, 2)
    print(string.byte(second))  -- 輸出 49(ASCII 碼值)
    

八、類型轉換與數值表示

操作成功返回值失敗返回值
tonumber("123")123nil
tonumber("0x1F")31nil
tostring(123)“123”-
tostring(nil)“nil”-

九、編程實踐要點

  1. 變量作用域:優先使用 local 聲明局部變量。
  2. 表操作:注意數組下標從 1 開始,# 僅統計連續數字下標長度。
  3. 字符串處理:使用 .. 連接,# 獲取字節長度。
  4. 函數設計:支持多返回值,參數不足自動補 nil
  5. 全局變量管理:通過 _G 表訪問,避免污染全局命名空間。

進一步學習建議

  • 參考 Lua 5.3 官方手冊
  • 搜索 “Lua 5.3 參考手冊” 查看完整函數庫(如數學庫、協程等)。

后面我會整理進階部分的筆記,之后會把筆記鏈接粘貼到這里。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77953.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

符號速率估計——小波變換法

[TOC]符號速率估計——小波變換法 一、原理 1.Haar小波變換 小波變換在信號處理領域被成為數學顯微鏡&#xff0c;不同于傅里葉變換&#xff0c;小波變換可以觀測信號隨時間變換的頻譜特征&#xff0c;因此&#xff0c;常用于時頻分析。 ??當小波變換前后位置處于同一個碼元…

android contentProvider 踩坑日記

寫此筆記原因 學習《第一行代碼》到第8章節實現provider時踩了一些坑&#xff0c;因此記錄下來給后來人和自己一個提示&#xff0c;僅此而已。 包含內容 Sqlite數據庫CURD內容provider界面provider項目中書籍管理provider實現邏輯用adb shell確認providercontentResolver接收…

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注冊中心2.CAP理論3.常見的注冊中心 二.Eureka介紹1.搭建Eureka Server 注冊中心2.搭建服務注冊3.服務發現 三.負載均衡LoadBalance1.問題引入2.服務端負載均衡3.客戶端負載均衡4.Spring Cloud LoadBalancer1).快速上手2)負載均衡策…

【開關電源】關于GaN反激電源開關噪聲

文章目錄 0 前言1 設計信息1.1 設計需求1.2 原理圖1.3 電源表現 2 原因分析3 橫向對比TI UCG28826 &#xff08;GaN&#xff09;采購的普通QR反激變換器 4 總結 0 前言 筆者原計劃設計一款省電的&#xff0c;效率尚可的&#xff0c;穩定的2路輸出反激電源&#xff0c;用于系統…

DOCA介紹

本文分為兩個部分&#xff1a; DOCA及BlueField介紹如何運行DOCA應用&#xff0c;這里以DNS_Filter為例子做大致介紹。 DOCA及BlueField介紹&#xff1a; 現代企業數據中心是軟件定義的、完全可編程的基礎設施&#xff0c;旨在服務于跨云、核心和邊緣環境的高度分布式應用工作…

mybatis mapper.xml中使用枚舉

重點&#xff1a;application.propertis配置類 #TypeEnumHandler 這個類的包名&#xff0c;不是全路徑 mybatis.type-handlers-packagecom.fan.test.handler兩個枚舉類&#xff1a; public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…

鴻蒙生態:鴻蒙生態校園行心得

&#xff08;個人觀點&#xff0c;僅供參考&#xff09; 兄弟們&#xff0c;今天來淺淺聊一聊這次的設立在長沙的鴻蒙生態行活動。 老樣子&#xff0c;我們先來了解一下這個活動&#xff1a; &#xff28;&#xff41;&#xff52;&#xff4d;&#xff4f;&#xff4e;&#x…

【速寫】多LoRA并行衍生的一些思考

遷移學習上的一個老問題&#xff0c;怎么做多領域的遷移&#xff1f;以前的邏輯認為領域遷移屬于是對參數做方向性的調整&#xff0c;如果兩個領域方向相左&#xff0c;實際上不管怎么加權相加都是不合理的。 目前一些做法想著去觀察LoRA權重矩陣中的稠密塊與稀疏塊&#xff0…

【Delphi 基礎知識 44】接口interface的應用

目錄 1. 前言2. 接口有哪些優勢2.1. 實現多態性2.2 實現多重(解決單繼承限制)2.3 解耦代碼(依賴注入)2.4 便于測試(模擬接口)2.5 跨語言互操作性(COM支持)1. 前言 總結為一句話就是:接口只告訴你要做什么,而類會告訴你應該怎么做 下面是最簡單的接口實現 typeIMyIn…

09.傳輸層協議 ——— TCP協議

文章目錄 TCP協議 談談可靠性TCP協議格式 序號與確認序號窗口大小六個標志位 確認應答機制&#xff08;ACK&#xff09;超時重傳機制連接管理機制 三次握手四次揮手 流量控制滑動窗口擁塞控制延遲應答捎帶應答面向字節流粘包問題TCP異常情況TCP小結基于TCP的應用層協議 TCP協…

NLP高頻面試題(五十一)——LSTM詳解

長短期記憶網絡(LSTM)相較于傳統循環神經網絡(RNN)的核心改進在于通過引入記憶單元(cell state)和門機制(gating mechanism)來有效緩解梯度消失與梯度爆炸問題,從而更好地捕捉長距離依賴關系 。在其網絡結構中,信息通過輸入門(input gate)、遺忘門(forget gate)和…

SpringCloud組件—Eureka

一.背景 1.問題提出 我們在一個父項目下寫了兩個子項目&#xff0c;需要兩個子項目之間相互調用。我們可以發送HTTP請求來獲取我們想要的資源&#xff0c;具體實現的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 舉個例子&#x…

無需花錢購買域名服務器!使用 VuePress + Github 30分鐘搭建屬于自己的博客網站(保姆級教程)

前言 GitHub Pages 提供免費全球加速的服務器資源&#xff0c;VuePress 將 Markdown 變成藝術品級的網頁&#xff0c;僅需 30 分鐘&#xff0c;你便可以像提交代碼一樣發布文章&#xff0c;過程完全免費。 博客搭建好的效果如下&#xff1a;https://honorsong.github.io/exam…

提交到Gitee倉庫

文章目錄 注冊配置公鑰創建空白的碼云倉庫把本地項目上傳到碼云對應的空白倉庫中 注冊 注冊并激活碼云賬號&#xff08; 注冊頁面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盤/用戶/用戶名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注冊時搞過&…

如何在 Java 中從 PDF 文件中刪除頁面(教程)

由于 PDF 文件格式不是 Java 原生支持的&#xff0c;因此要從 PDF 中刪除頁面&#xff0c;你需要使用外部庫。 本教程介紹如何使用 JPedal 來實現這一功能。 開始使用 ? 將 JPedal 添加到你的類路徑或模塊路徑中&#xff08;可從官網下載安裝試用版 JAR 文件&#xff09; ?…

機器學習第二篇 多變量線性回歸

數據集&#xff1a;世界幸福指數數據集中的變量有幸福指數排名、國家/地區、幸福指數得分、人均國內生產總值、健康預期壽命、自由權、社會支持、慷慨程度、清廉指數。我們選擇GDP per Capita和Freedom&#xff0c;來預測幸福指數得分。 文件一&#xff1a;linear&#xff0c;…

位運算,狀態壓縮dp(算法競賽進階指南學習筆記)

目錄 移位運算一些位運算的操作最短 Hamilton 路徑&#xff08;狀態壓縮dp模板&#xff0c;位運算&#xff09; 0x是十六進制常數的開頭&#xff1b;本身是聲明進制&#xff0c;后面是對應具體的數&#xff1b; 數組初始化最大值時用0x3f賦值&#xff1b; 移位運算 左移 把二…

Java高頻面試之并發編程-05

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;線程有哪些調度方法&#xff1f; 在Java中&#xff0c;線程的調用方法主要包括以下幾種方式&#xff0c;每種方式適用于…

進程的同步和互斥

進程同步&#xff08;synchronous&#xff09; ?通俗理解&#xff1a; 就像在排隊買飯&#xff0c;一個一個來&#xff0c;前面的人不走&#xff0c;后面的人就不能干事。 進程同步就是&#xff1a;多個進程之間需要協調&#xff0c;有先后順序&#xff0c;一個進程要等另一…

PDF處理控件Aspose.PDF指南:使用 Python 將 EPUB 轉換為 PDF

EPUB是一種流行的電子書格式&#xff0c;用于可重排內容&#xff0c;而PDF則廣泛用于固定版式文檔&#xff0c;非常適合共享和打印。如果您想使用 Python 將 EPUB 轉換為 PDF&#xff0c;Aspose.PDF for Python 提供了一個簡單可靠的解決方案。在本教程中&#xff0c;我們將向您…