lua基礎語法學習

lua基礎語法學習

文章目錄

  • lua基礎語法學習
    • 1. 基礎
    • 2. 輸入輸出
    • 3. 分支結構與循環結構
    • 4. 函數
    • 5. 元表與元方法
    • 6. 面向對象

1. 基礎

注釋

--單行注釋--[[
多行注釋
--]]

標識符

標識符以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭后加上 0 個或多個字母,下劃線,數字(0 到 9)。

Lua 不允許使用特殊字符如 @, $, 和 % 來定義標識符。 Lua 是一個區分大小寫的編程語言。

關鍵詞

andbreakdoelse
elseifendfalsefor
functionifinlocal
nilnotorrepeat
returnthentrueuntil
whilegoto

其它運算符

操作符描述實例
連接兩個字符串a…b ,其中 a 為 "Hello " , b 為 “World”, 輸出結果為 “Hello World”。
#一元運算符,返回字符串或表的長度。#“Hello” 返回 5

數據類型

數據類型描述
nil這個最簡單,只有值nil屬于該類,表示一個無效值(在條件表達式中相當于false)。
boolean包含兩個值:false和true。lua中數字0是true
number表示雙精度類型的實浮點數
string字符串由一對雙引號或單引號來表示
function由 C 或 Lua 編寫的函數
userdata表示任意存儲在變量中的C數據結構
thread表示執行的獨立線路,用于執行協同程序
tableLua 中的表(table)其實是一個"關聯數組"(associative arrays),數組的索引可以是數字、字符串或表類型。在 Lua 里,table 的創建是通過"構造表達式"來完成,最簡單構造表達式是{},用來創建一個空表。索引從1開始

Lua 把 false 和 nil 看作是 false,其他的都為 true,數字 0 也是 true

--string
a=[[
<p>表示一塊字符串</p>
]]
b="123"
a,b=b,a --交換a,b的值--table
local tbl2 = {"apple", "pear", "orange", "grape"}
a = {}
a["key"] = "value"
print(a.key) --當索引為字符串類型時可這樣用
a[10]=22
for k, v in pairs(a) doprint(k .. " : " .. v)
end
a=nil --移除引用,垃圾回收--function
function factorial1(n)local jk=5print("局部變量jk: "..jk)if n == 0 thenreturn 1elsereturn n * factorial1(n - 1)end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))--匿名函數
function testFun(tab,fun)for k ,v in pairs(tab) doprint(fun(k,v));end
endtab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函數return key.."="..val;
end
);

2. 輸入輸出

-- 提示用戶輸入
print("請輸入一些文本:")
-- 讀取用戶輸入的一整行
local userInput = io.read("*line")
-- 輸出用戶輸入的內容
print("您輸入的是:" .. userInput)

3. 分支結構與循環結構

if

a = 100
if( a == 10 ) thenprint("a 的值為 10" )
elseif( a == 20 ) then   print("a 的值為 20" )
elseif( a == 30 ) thenprint("a 的值為 30" )
elseprint("沒有匹配 a 的值" )
end
print("a 的真實值為: ", a )

for

--[[ 數值for
var 從 exp1 變化到 exp2,每次變化以 exp3 為步長遞增 var,并執行一次 "執行體"。
exp3 是可選的,如果不指定,默認為1。
for var=exp1,exp2,exp3 do<執行體> 
end
]]function f(x)  print("function")  ;return x*2  ;
end  
for i=0,f(5),2 do print(i)  --f(5)只在開始時執行一次
end--[[ 泛型for
a = {"one", "two", "three"}
for i, v in ipairs(a) doprint(i, v)
end 
]]

在這里插入圖片描述

repeat…until

--[ 變量定義 --]
a = 10
--[ 執行循環 --]
repeatprint("a的值為:", a)a = a + 1
until( a > 15 )

在這里插入圖片描述

while

-- 定義變量
a = 10-- while 循環
while( a < 20 )
doprint("a 的值為:", a)a=a+1if( a > 15)then--[ 使用 break 語句終止循環 --]breakend
end

4. 函數

在函數參數列表中使用三點 ... 表示函數有可變的參數

  • select(‘#’, …) 返回可變參數的長度。
  • select(n, …) 用于返回從起點 n 開始到結束位置的所有參數列表。
function average(...)result = 0local arg={...} -- {...} 表示一個由所有變長參數構成的數組  for i,v in ipairs(arg) doresult = result + vendprint("總共傳入 " .. select("#",...) .. " 個數")print(select(1,...))return result/select("#",...)endprint("平均值為",average(10,5,3,4,5,6))

在這里插入圖片描述

5. 元表與元方法

__add

t={a=1}
mt={	--元表__add=function (a,b)return a.a+bend
}
setmetatable(t,mt) -- 把mt設為t的元表 
--t的加法被mt的加法替換了print(t+1) --2

__index

t={a=1}
mt={__index=function (table,key)return 123end
}
setmetatable(t,mt) -- 把mt設為t的元表 
print(t['abc']) --123
--t的鍵沒有abc或者t不是table時,會調用__index元方法t2={a=15}
mt2={__index={abc=456,def=789,}
}
setmetatable(t2,mt2) -- 把mt設為t的元表 
print(t2['abc']) --456

__newindex

t={a=1}
mt={__newindex=function (table,key,value)-- rawset(table,key,value)-- 不能table[key]=value,因為賦值操作也會調用__newindex最后導致堆棧溢出end
}
setmetatable(t,mt) -- 把mt設為t的元表 
t.abc=123 --t原本不存在鍵abc,會調用__newindex方法
print(t['abc']) --nil
--t不存在這個key或t不是表時,會調用__newindex元方法

語法糖

t={a=0,add=function(table,sum)table.a=table.a+sumend
}
t:add(10)
-- 等價于t.add(t,10)
print(t['a'])
bag={}
bmt={put=function(t,item)table.insert(t.items,item)end,take=function(t,key)return table.remove(t.items,key)end,list=function(t)return table.concat(t.items,",")end,clear=function(t)t.items={}end
}
bmt['__index']=bmt
function bag.new()local t={items={}}setmetatable(t,bmt)return t
end
local b=bag.new()
b:put("apple")
b:put("banana")
b:put("banana")
print(b:take())-- banana
print(b:list())-- apple,banana
b:clear()

6. 面向對象

Lua 的模塊是由變量、函數等已知元素組成的 table

Lua 中的類可以通過 table + function 模擬出來。

至于繼承,可以通過 metatable 模擬出來

-- 定義 Person 類
Person = {name = "", age = 0}-- Person 的構造函數
function Person.new(self,name, age)local obj = {}  -- 創建一個新的表作為對象setmetatable(obj, self)  -- 設置元表,使其成為 Person 的實例self.__index = self  -- 設置索引元方法,指向 Personobj.name = nameobj.age = agereturn obj
end-- 添加方法:打印個人信息
function Person.introduce(self)print("My name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
p=Person:new("zhangsan", 100)
p.introduce(p)
p2=Person:new("lisi", 80)
p2.introduce(p2)

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

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

相關文章

使用DeepSeek實現自動化編程:類的自動生成

目錄 簡述 1. 通過注釋生成C類 1.1 模糊生成 1.2 把控細節&#xff0c;讓結果更精準 1.3 讓DeepSeek自動生成代碼 2. 驗證DeepSeek自動生成的代碼 2.1 安裝SQLite命令行工具 2.2 驗證DeepSeek代碼 3. 測試代碼下載 簡述 在現代軟件開發中&#xff0c;自動化編程工具如…

【SpringBoot】數據訪問技術spring Data、 JDBC、MyBatis、JSR-303校驗

Spring Boot 數據訪問技術及特性 目錄標題 Spring Boot 數據訪問技術及特性摘要1. 引言2. Spring Data架構與原理2.1 Spring Data概述2.2 Spring Data核心組件2.3 Spring Boot與Spring Data的集成機制 3. Spring Boot與JDBC的整合3.1 JDBC整合流程3.2 數據源自動配置3.3 JdbcTe…

【時序預測】深度時序預測算法的對比與核心創新點分析

時間序列預測是機器學習和深度學習領域的重要研究方向&#xff0c;廣泛應用于金融、交通、能源、醫療等領域。近年來&#xff0c;隨著深度學習技術的發展&#xff0c;各種基于深度學習的時間序列預測算法層出不窮。這些算法在模型架構、訓練方式和應用場景上各有特色。本文將對…

JVM線程分析詳解

java線程狀態&#xff1a; 初始(NEW)&#xff1a;新創建了一個線程對象&#xff0c;但還沒有調用start()方法。運行(RUNNABLE)&#xff1a;Java線程中將就緒&#xff08;ready&#xff09;和運行中&#xff08;running&#xff09;兩種狀態籠統的稱為“運行”。 線程對象創建…

android智能指針android::sp使用介紹

android::sp 是 Android 中的智能指針&#xff08;Smart Pointer&#xff09;的實現&#xff0c;用于管理對象的生命周期&#xff0c;避免手動管理內存泄漏等問題。它是 Android libutils 庫中重要的一部分&#xff0c;常用于管理繼承自 android::RefBase 的對象。 與標準庫中…

spring整合mybatis詳細步驟

spring整合mybatis的全部過程(整合方式一 &#xff1a;簡單版) 1.在pom.xml中導入mybatis相應的jar包&#xff1a; (2) < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.5.3&…

2025年Linux主力系統選擇指南:基于最新生態的深度解析(附2025年發行版對比速查表)

Linux發行版生態在2025年持續演進&#xff0c;既有經典系統的迭代升級&#xff0c;也有新興項目的崛起。本文結合最新行業動態&#xff0c;從個人用戶到企業場景&#xff0c;梳理主力系統選擇策略&#xff0c;助你找到最適合的Linux發行版。 一、新手友好型&#xff1a;平滑過渡…

ai-2、機器學習之線性回歸

機器學習之線性回歸 1、機器學習2、線性回歸2.1、梯度下降法 3、python下調用scikit-learn 1、機器學習 2、線性回歸 ####所以y可以當成我們需要的結果&#xff0c;根據公式可以求的y一撇的值更小&#xff0c;所以更接近需要的結果&#xff0c;所以y一撇擬合性更好 2.1、梯度下…

Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存

Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存 目錄 Flutter 學習之旅 之 flutter 在 Android 端進行簡單的打開前后相機預覽 / 拍照保存 一、簡單介紹 二、簡單介紹 camera 三、安裝 camera 四、簡單案例實現 五、關鍵代碼 一、簡單…

【原創】Open WebUI 本地部署

使用官網的默認部署&#xff0c;遇到不少的問題。比如白屏問題&#xff0c;其實需要修改幾個參數即可。 其實在部署的時候有不少參數 WEBUI_AUTH False ENABLE_OPENAI_API 0 PATH /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LANG C.UTF-8…

【造個輪子】使用Golang實現簡易令牌桶算法

本文目錄 1. 令牌桶算法2. 調用第三方庫實現令牌桶3. 手撕令牌桶 前言&#xff1a;之前在Bluebell社區項目中&#xff0c;我們使用了開源的庫來實現令牌桶限流&#xff0c;這次我們試著使用Go來手撕實現下令牌桶算法。 1. 令牌桶算法 為了防止網絡擁塞&#xff0c;需要限制流…

C#開發的Base64編碼及解碼完整源碼及注意事項

在軟件開發時&#xff0c;經常用Base64編碼和解碼功能。本文介紹一個簡單易用的Base64 編碼和解碼工具&#xff0c;顧名思義&#xff0c;就是簡單快捷地進行 Base64 代碼的解碼或編碼操作。您的數據可以輕松地編碼為 Base64 編碼&#xff0c;也可以解碼為可讀的格式。傳輸數據時…

【Linux第一彈】Linux基礎指令(上)

目錄 1.ls指令 1.1 ls使用實例 2.pwd指令 3.cd指令 3.1 cd使用實例 4.touch指令 4.1touch使用實例 5.mkdir指令 5.1mkdir使用實例 6.rmdir指令和rm指令 6.1 rmdir指令使用實例->: 6.2 rm指令使用實例 7.man指令 8.cp指令 8.1 cp 使用實例 9.mv指令 9.1mv使用…

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客戶端與 RabbitMQ 服務器通信的虛擬會話通道&#xff0c;其核心作用在于優化資源利用并提升消息處理效率。以下是其核心機制與功能的詳細解析&#xff1a; 一、Channel 的核心定義 虛擬通信鏈路 Channel 是建立在 TCP 連…

Zookeeper(80)Zookeeper的常見問題有哪些?

Zookeeper作為分布式系統的協調服務&#xff0c;常見的問題主要集中在配置、性能、連接管理、數據一致性和節點故障等方面。以下是一些常見問題及其詳細解決方法和代碼示例。 1. 配置問題 問題描述 配置不當可能導致 Zookeeper 集群無法正常啟動或運行效率低下。 解決方法 …

如何管理路由器

一、管理路由器的必要性 1、需要修改撥號上網的密碼。 2、需要修改WIFI的SSID名字和密碼。 3、設置DHCP協議信息。 4、設置IP地址的過濾規則。 5、給某個設備連接設置網絡限速。 二、常見的方式 (一)web網頁方式 1、計算機用雙絞線或者WIFI的方式連接路由器。 2、在計算機中打開…

linux vim 撤銷 回退操作

在Linux的vim編輯器中&#xff0c;撤銷和回退操作是非常基本的&#xff0c;但它們可以通過不同的方式實現&#xff0c;具體取決于你想要的精確效果。下面是一些常用的方法&#xff1a; 1. 撤銷&#xff08;Undo&#xff09; 單個撤銷&#xff1a; 你可以通過按下u鍵來撤銷上一…

淺談流媒體協議以及視頻編解碼

流媒體協議介紹 流媒體協議用于傳輸視頻、音頻等多媒體數據&#xff0c;確保數據流暢地傳輸到用戶設備。常見的流媒體協議包括 RTMP、HLS、DASH、WebRTC 等&#xff0c;每種協議具有不同的特點和適用場景。 1. RTMP (Real-Time Messaging Protocol) 定義&#xff1a;由 Adob…

AF3 DataPipeline類process_multiseq_fasta 方法解讀

AlphaFold3 data_pipeline 模塊DataPipeline類的 process_multiseq_fasta 方法用于處理多序列 FASTA 文件,生成 AlphaFold3 結構預測所需的特征,適用于多鏈復合物的預測。它結合了 Minkyung Baek 在 Twitter 上提出的“AlphaFold-Gap”策略,即通過在多鏈 MSA 中插入固定長度…

圖片爬取案例

修改前的代碼 但是總顯示“失敗” 原因是 修改之后的代碼 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…