【Lua語言】Lua語言快速入門

初始Lua

???????Lua是一種輕量小巧的腳本語言,他使用標準C語言編寫并以源代碼形式開放。這意味著Lua虛擬機可以很方便的嵌入別的程序中,從而為應用程序提供靈活的擴展和定制功能。同時,在目前腳本引擎中,Lua的運行速度占有絕對優勢

變量

number變量(這個類型與C語言的double類型類似)

???????變量,可以看做是一個桶,在里面裝入自己想裝的內容。這些內容可以是Lua包含的所有合法類型。例如,我想創建一個變量,里面放入920這個數字:

bucket = 920 (全局變量)

???????不過,這樣寫的話,這個變量是全局變量,在其他文件也可以使用到。如果我們只想在本文件下使用,我們可以使用local修飾變量,如下所示:

local bucket = 920

了解nil(與null類似)

???????nil類型表示沒有任何有效值,只要是沒有生命的值,他就是nil。比如打印一個沒有創建的變量,就會輸出nil:

ccc = 233
print(ccc)
print(aaa)  --nil

在Lua中,nil和0是有區別的:

含義差異:

  • nil:在Lua中,nil是一種特殊的數據類型,他只有一個值,也就是nil。nil一般用于表示一個變量未被賦值或者某個值不存在。
  • 0:0屬于數字類型,代表數值零,在數字運算以及邏輯判斷等場景中使用

邏輯判斷中的表現:

  • 在條件判斷里,除了?nil?和?false?會被視為假,其他值(包含?0)都被視為真。下面是示例代碼:
  • -- 判斷0和nil在條件判斷中的表現
    if 0 thenprint("0在條件判斷中被視為真")
    elseprint("0在條件判斷中被視為假")
    endif nil thenprint("nil在條件判斷中被視為真")
    elseprint("nil在條件判斷中被視為假")
    end

賦值和使用情況:

  • nil:當一個變量被賦值為?nil?時,就相當于將這個變量刪除,后續若使用該變量就會引發錯誤(除非再次賦值)。
  • 00?是一個正常的數值,可用于各種數學運算和邏輯操作。

賦值語句

賦值是改變一個變量值的最基本的方法,如下面一樣,使用等號對左邊的變量進行賦值。

n = 2
n = 3
n = n + 1
b = n

注意:在 Lua 里,并沒有像 C、Java 這類語言中使用的?++?自增運算符,也沒有?n += 1?這種復合賦值運算符。不過,你可以使用其他方式來實現相同的功能。

?Lua可以對多個變量同時賦值,變量使用逗號分開,賦值語句右邊的值會依次賦值給左邊的變量。

n = 1
a, b = 10, 2*n

當左右值的數量不一致時,Lua會進行下面的設定:

  • 變量個數 > 值的個數:按變量個數補足nil
  • 變量個數 < 值的個數:多余的值會被忽略
a, b, c = 0, 1
print(a,b,c)
--輸出0   1   nila, b = a+1, b+1, b+2
print(a,b)
--輸出1   2a, b, c = 0
print(a,b,c)
--輸出0   nil   nil

數值型

???????在Lua中,數值型(number)是一種基本的數據類型,用于表示數字。下面從多個方面對Lua中的數值型進行介紹:

表示范圍

???????在 Lua 5.3 及之后的版本中,數值型默認采用雙精度浮點數(64 位)來表示,能夠表示非常大或者非常小的數。其表示范圍大致為 ±1.8×10^308 ,精度約為 15 - 17 位十進制數字。而在早期的 Lua 版本中,數值型使用的是雙精度浮點數或者整數(取決于編譯選項)。

整數和浮點數

???????在 Lua 5.3 及后續版本中,數值型可以表示整數和浮點數。

整數

可以直接使用沒有小數點的數字來表示整數,例如:

local num1 = 10
local num2 = -20

浮點數

使用帶小數點或者科學計數法的數字來表示浮點數,例如:

local num3 = 3.14
local num4 = 1.23e-5  -- 表示1.23×10^(-5)

類型判斷

可以使用?type()?函數來判斷一個變量是否為數值型,示例如下:

local num = 5
if type(num) == "number" thenprint("num是數值型")
end

數字運算

???????數值型變量能夠進行常見的數學運算,例如加(+)、減(-)、乘(*)、除(/)、取模(%)、冪運算(^)等,示例代碼如下:

local a = 10
local b = 3
local sum = a + b
local difference = a - b
local product = a * b
local quotient = a / b
local remainder = a % b
local power = a ^ bprint("和: ", sum)
print("差: ", difference)
print("積: ", product)
print("商: ", quotient)
print("余數: ", remainder)
print("冪: ", power)

整數和浮點數的轉換

???????在 Lua 中,整數和浮點數之間可以進行隱式轉換。例如,在進行某些運算時,整數可能會轉換為浮點數:

local num1 = 5
local num2 = 2
local result = num1 / num2  -- 這里結果是浮點數2.5

也可以使用?math.floor()math.ceil()?和?math.modf()?等函數進行顯式轉換:

local num = 3.14
local floor_num = math.floor(num)  -- 向下取整,結果為3
local ceil_num = math.ceil(num)    -- 向上取整,結果為4
local integer_part, fractional_part = math.modf(num)  -- 分離整數部分和小數部分

特殊數值

???????Lua 中的數值型還包含一些特殊數值,例如?math.huge?表示正無窮大,-math.huge?表示負無窮大,0/0?會得到?nan(非數值):

local inf = math.huge
local neg_inf = -math.huge
local nan = 0/0print("正無窮大: ", inf)
print("負無窮大: ", neg_inf)
print("非數值: ", nan)

字符串

string類型變量

???????字符串(即string),就是一串文本數據,可以存儲你要的文本。print出的數據就是一個字符串。Lua語言中字符串可以使用以下三種方式來表示:

  • 單引號間的一串字符
  • 雙引號間的一串字符
  • [[ 和 ]]間的一串字符
--雙引號間的一串字符
str1 = "Lua"
--單引號間的一串字符
str2 = 'Lua'
--[[和]]--間的一串字符
str3 = [[Lua]]
str4 = [[使用雙括號時,甚至能包含換行數據
換行了
最后一行]]--輸出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)

轉義字符

???????轉義字符用于表示不能直接顯示的字符,比如后退鍵、回車鍵、等。以?\?開頭的都是轉義字符,下面時常用的轉義字符格式:

string拼接

???????字符串和字符串可以相加,我們可以使用拼接符號來將兩個獨立的字符串拼起來。我們使用 .. 來表示字符串拼接符號:

print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)

number和string的轉換

???????我們可以直接將number類型的變量n轉換成string類型的值,這樣就可以拼接了。使用tostring(value)函數即可實現這一操作:

n = 123
s = 'm/s'result = tostring(n)..s
print(result)

???????我們可以直接將string類型的變量s轉換成number類型的值,這樣就可以計算了。使用tonumber(value)函數即可實現這一操作:

n = 123
s = '2333'result = tonumber(s) + n
print(result)

函數

local變量

???????全局變量在代碼運行周期從頭到尾,都不會被銷毀,而且隨處都可以調用。當代碼量增加時,很多時候大量新建全局變量會導致內存激增,我們需要一種可以臨時使用、并且可以自動銷毀釋放內存資源的變量,我們可以使用local標志來新建臨時變量,使用local創建一個局部變量,與全局變量不同,局部變量只在被聲明的那個代碼塊內有效。

a = 123
function add()local n = a+2print(n)
end
add()
print(n)

函數參數

???????函數內是可以傳參的,這里傳入的參數等價于在函數內部新建了一個local變量,修改這些數據不會影響外部的數據(除了后面還沒有講到的table類型)

函數返回值

這里需要注意的是,函數可以返回多個值。

table

認識數組

???????數組,使用一個變量名,存儲一系列的值。在Lua中,我們可以使用tables(表)來實現這個功能。在Lua中,table是一個一系列元素的集合,使用大括號進行表示,其中的元素之間以逗號分隔,類似下面的代碼:

t = {1,3,8,5,4}

???????我們可以直接使用元素的下標來訪問,或者對該元素進行賦值操作。在上面的table中,第一個元素的下標是1,第二個是2,依次類推

簡單table

???????table中可以存儲任意類型的數據,比如,我們可以在table中放置number和string數據,還可以放置函數,類似于下面的代碼:

t = {"abc",223,",..a",123123}t = {function() return 123 end,function() print("abc") end,function(a,b) return a+b end,function() print("hello world") end,
}
t[1]()
t[2]()
t[3](1,2)
t[4]()

這些table訪問每一個元素的方式任然是直接使用下標,并且可以使用下標來進行修改。?

table下標

在Lua中,下標可以直接在聲明時進行指定,像下面這樣:

t = {6,7,8,9}
--上面和下面的代碼等價
t = {[1] = 6,[2] = 7,[3] = 8,[4] = 9,
}--甚至你可以跳過某些下標
t = {[1] = 6,[3] = 7,[5] = 8,[7] = 9,
}
print(t[7])
--輸出9--在聲明后賦予元素值也是可以的
t = {}--空的table
t[101] = 10
print(t[101])
--輸出10

有上面可以自定義下標,那么我們也可以自定義字符串下標,代碼如下所示:

t = {["apple"] = 10,banana = 12,pear = 6,
}
--使用["下標"] = 值
--和  下標 = 值
--都是正確寫法
--當第二種方式有歧義時,應該用第一種方式--可以用下面兩種方式訪問:
print(t["apple"])
--輸出10
print(t.apple)
--輸出10
--當第二種方式有歧義時,應該用第一種方式

Lua全局變量與table

實際上,在Lua中,所有的全局變量全部被存放在了一個大table中,這個table名為:_G

table增刪

table.insert (table, [pos ,] value)

???????在(數組型)表 table 的 pos 索引位置插入 value,其它元素向后移動到空的地方。pos 的默認值是表的長度加一,即默認是插在表的最后。

table.remove (table [, pos])

???????在表 table 中刪除索引為 pos(pos 只能是 number 型)的元素,并返回這個被刪除的元素,它后面所有元素的索引值都會減一。pos 的默認值是表的長度,即默認是刪除表的最后一個元素。

邏輯運算

布爾型和比較運算

???????布爾型(boolean)只有兩個可選值:true(真) 和?false(假)。Lua 把 false 和 nil 看作是false,其他的都為true(包括0這個值,也是相當于true

Lua 中也有許多的關系運算符,用于比較大小或比較是否相等,符號及其含義如下表:

邏輯運算符

???????邏輯運算符基于布爾型的值來進行計算,并給出結果,下表列出了 Lua 語言中的常用邏輯運算符:

循環

while循環

while 繼續循環判斷依據 do執行的代碼
end

for循環

for 臨時變量名=開始值,結束值,步長 do循環的代碼
end

中斷循環

???????有些時候循環運行到一半,我們不想再繼續運行了,怎么辦呢?我們可以在一個循環體中使用break,來立即結束本次循環,繼續運行下面的代碼:

result = 0
for i=1,100 doresult = result + iif result > 100 thenresult = result - ibreakend
endprint(result)

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

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

相關文章

車載診斷新架構--- SOVD初入門(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

linux查看目錄相關命令

查看目錄命令 學習目標 能夠使用Linux命令查看目錄信息 1. 查看目錄命令的使用 命令說明ls查看當前目錄信息tree以樹狀方式顯示目錄信息 ls命令效果圖: tree命令效果圖: 2. 查看當前目錄路徑 命令說明pwd查看當前目錄路徑 pwd命令效果圖: 3. 清除終端內容 命令說明clear…

JavaScript中的Event事件對象詳解

一、事件對象&#xff08;Event&#xff09;概述 1. 事件對象的定義 event 對象是瀏覽器自動生成的對象&#xff0c;當用戶與頁面進行交互時&#xff08;如點擊、鍵盤輸入、鼠標移動等&#xff09;&#xff0c;事件觸發時就會自動傳遞給事件處理函數。event 對象包含了與事件…

OSPF綜合實驗(HCIP)

1&#xff0c;R5為ISP&#xff0c;其上只能配置Ip地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過ppp協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b; 3&#xff0c;所有設備均可訪問R5的環回&…

2024-04-19| Java: Documented注解學習 JavaDoc

在 Java 中&#xff0c;Documented 是一個元注解&#xff08;meta-annotation&#xff09;&#xff0c;用于標記其他注解&#xff0c;表明這些注解應該被包含在 JavaDoc 文檔中。以下是關于 Documented 注解的作用的簡要說明&#xff1a; 作用 記錄注解信息到 JavaDoc&#x…

15.Chromium指紋瀏覽器開發教程之WebAudio指紋定制

WebAudio指紋概述 瀏覽器中的 WebAudio API 提供了豐富的功能&#xff0c;其中包括了大量生成和處理音頻數據的API。WebAudio API 的音頻指紋技術是一種利用音頻信號的特征來唯一標識音頻的技術。因為WebAudio API 提供了豐富的音頻處理功能&#xff0c;包括合成、過濾、分析等…

2025年贛教云智慧作業微課PPT模板

江西的老師們注意&#xff0c;2025年贛教云智慧作業微課PPT模版和往年不一樣&#xff0c;千萬不要搞錯了&#xff0c;圖上的才是正確的2025年的贛教云智慧作業微課PPT模版&#xff0c;贛教云智慧作業官網有問題&#xff0c;無法正確下載該模板&#xff0c;需要該模板的&#xf…

2.5.1DOS下常用工具 curl,netstat,telnet命令使用

curl命令 Win10及以上系統默認已安裝Curl&#xff0c;打開命令提示符輸入 curl --help&#xff0c;若顯示幫助信息則無需安裝 ??手動安裝方法?? 官網下載&#xff1a;訪問 curl官網 選擇Windows版本curl for Windows若需在 Windows XP 等舊系統使用&#xff0c;需選擇更…

使用Redis實現實時排行榜

為了實現一個實時排行榜系統&#xff0c;我們可以使用Redis的有序集合&#xff08;ZSet&#xff09;&#xff0c;其底層通常是使用跳躍表實現的。有序集合允許我們按照分數&#xff08;score&#xff09;對成員&#xff08;member&#xff09;進行排序&#xff0c;因此非常適合…

Linux——firewalld防火墻(筆記)

目錄 一&#xff1a;Firewalld防火墻的概述 &#xff08;1&#xff09;firewalld簡介 &#xff08;2&#xff09;firewalld&iptables的關系 &#xff08;3&#xff09;firewalld與iptables service的區別 1. ?規則管理方式? 2. ?默認策略與設計邏輯? 3. ?配置文…

JS中實現類似sleep、wait、delay的延時功能

前言 編寫代碼時很多時候需要進行流程化的操作&#xff0c;各個流程間通常需要等待一定時間&#xff0c;這在很多語言中通常可以使用 sleep 、 wait 、 delay 等函數來實現。JavaScript原生并沒有類似的功能&#xff0c;想要延時通常就是使用 setTimeout(functionRef, delay) …

Elasticsearch:使用 ES|QL 進行搜索和過濾

本教程展示了 ES|QL 語法的示例。請參考 Query DSL 版本&#xff0c;以獲得等效的 Query DSL 語法示例。 這是一個使用 ES|QL 進行全文搜索和語義搜索基礎知識的實踐介紹。 有關 ES|QL 中所有搜索功能的概述&#xff0c;請參考《使用 ES|QL 進行搜索》。 在這個場景中&#x…

Java 動態代理實現

Java 動態代理實現 一、JDK動態代理二、CGLIB動態代理三、動態代理的應用場景四、JDK代理與CGLIB代理比較 動態代理是Java中一種強大的技術&#xff0c;它允許在運行時創建代理對象&#xff0c;用于攔截對目標對象的方法調用。 一、JDK動態代理 JDK動態代理是Java標準庫提供的代…

Apache IoTDB V2.0.2/V1.3.4 發布|新增表模型權限管理、UDF、嵌套查詢功能

Release Announcement Version 2.0.2/1.3.4 Apache IoTDB V2.0.2、V1.3.4 已經發布&#xff01; V2.0.2 作為樹表雙模型正式版本&#xff0c;主要新增表模型權限管理、用戶管理以及相關操作鑒權&#xff0c;并新增了表模型 UDF、系統表和嵌套查詢等功能。 V1.3.4 主要新增模式…

鴻蒙開發11-ARKUI框架

ARKUI&#xff08;方舟 UI 框架&#xff09;是 HarmonyOS Next&#xff08;原 OpenHarmony&#xff09;的核心 UI 開發框架&#xff0c;基于聲明式編程范式&#xff0c;支持 ArkTS 語言&#xff0c;能夠高效構建跨設備的響應式應用。以下是對 ARKUI 框架及開發的詳細介紹&#…

Linux 進程間通信詳解

一.進程間通信介紹 1. 進程間通信概念 進程間通信&#xff08;Inter-Process Communication, IPC&#xff09;是指在不同進程之間傳遞或交換信息的一種機制。在操作系統中&#xff0c;進程是資源分配和獨立運行的基本單位&#xff0c;它們擁有各自獨立的內存空間和系統資源。…

從0開始掌握動態規劃

動態規劃的核心思想 -- 以空間換時間 復雜點說通過分解問題為子問題并存儲子問題解來優化復雜計算的算法策略。 簡單看個問題。 一&#xff0c;初始&#xff1a;求最長連續遞增子序列 nums [10,9,2,5,3,7,101,18] 求上面數組中的最長連續遞增子序列&#xff0c;輸出其長度 …

Python Requests 庫:從安裝到精通

摘要 本文詳細介紹 Python Requests 庫的安裝與使用&#xff0c;通過常見示例讓你輕松掌握。 一、引言 在當今的互聯網時代&#xff0c;與各種 Web 服務進行交互是非常常見的需求。Python 作為一門功能強大且易于學習的編程語言&#xff0c;提供了許多用于網絡請求的庫&…

Manus技術架構、實現內幕及分布式智能體項目實戰

Manus技術架構、實現內幕及分布式智能體項目實戰 模塊一&#xff1a; 剖析Manus分布式多智能體全生命周期、九大核心模塊及MCP協議&#xff0c;構建低幻覺、高效且具備動態失敗處理能力的Manus系統。 模塊二&#xff1a; 解析Manus大模型Agent操作電腦的原理與關鍵API&#xf…

C算術運算符 printf輸出格式 字符指針打印輸出 使用scanf函數進行輸入

一 算術運算符 加, 一元取正 - 減, 一元取負 * 乘 / 除 % 求余 -- 自減1 自加1 邏輯運算符 && 邏輯與 || 邏輯或 ! 邏輯非 關系運算符 > 大于 > 大于等于 < 小于 < 小于等于 等于 ! 不等于 位運算符號 & 按位與 | 按位或 ^ 按位異或…