lua(xlua)基礎知識點記錄一

1. 關于 (…) 操作符

編譯階段優化:

Lua 編譯器會對常量字符串進行優化處理,將連續的字符串拼接操作 (…)
合并為單個字符串。這種優化僅適用于編譯期確定的常量字符串,不適用于運行時生成的動態字符串。 示例:

local str = "Hello" .. " " .. "World".."!!"
print(str) -- 編譯時等價于:local str = "Hello World"
--這段代碼運行后只會產生一個字符,(..)拼接過程中不會產生臨時字符串

運行時拼接:

當拼接操作涉及變量或動態值時,優化不會生效,拼接將在運行時執行。對于頻繁的字符串拼接操作,建議使用 table.concat
以避免創建大量臨時字符串導致的性能問題。 示例:

local a = "Hello"
local b = "World"
local c = "!!"
local str = a .. " " .. b.." "..c -- 運行時執行拼接
print(str)

2. 關于 table.concat

table.concat 要求數組元素必須是字符串或數字類型。數字會自動轉換為字符串,其他類型(如 boolean、table 或
nil)會引發錯誤。

3. 關于 xLua 調用 C# 重載方法

數字類型匹配:

Lua 僅使用 number 類型表示數字,而 C#包含多種數值類型(int、float、double、long)。當調用重載方法時,xLua 會按方法定義順序依次匹配參數類型。 需要注意的是int,float,double,long都屬于number 所以即使傳遞的是1.1這種浮點型,但是c#中仍然會調到第一個匹配以上四個參數的函數。
示例:比如如下代碼.lua調用會走到第一個也就是int型的重載函數中

//Main.cs
public class Main{static int c1, c2, c3, c4, c5,c6,c7;public static void Execute(int a){c1++;}public static void Execute(float a){c2++;}
}
--text.lua
CS.Main.Execute(1.1)

nil 類型

Lua 傳 nil 會被c#轉換為 null,這種情況下,對于引用類型參數的傳遞null,仍可以正常調用,匹配規則仍然是按照重載定義的順序。

lua傳遞參數個數多于#方法參數個數

傳遞參數多余c#方法的參數上限會報錯。

// C# 重載方法
public class MethodOverloading : MonoBehaviour
{public void Method(float num1){Debug.Log("Method(float num1)");}public void Method(int num1){Debug.Log("Method(int num1)");}public void Method(string num1){Debug.Log("Method(string num1)");}
}
local classObject = CS.MethodOverloading()
classObject:Method(10) -- 輸出結果取決于方法定義順序

注:修改方法定義順序將影響最終的調用結果。

下面是關于Xlua的luaCallc#調用反射源碼(非warp方式調用):

//xlua匹配函數代碼:
public int Call(RealStatePtr L)
{try{//若僅存在一個重載方法,且該方法無默認參數且無需強制類型檢查,則直接調用該重載。if (overloads.Count == 1 && !overloads[0].HasDefalutValue && !forceCheck) return overloads[0].Call(L);for (int i = 0; i < overloads.Count; ++i) //順序遍歷所有重載{var overload = overloads[i];if (overload.Check(L))//檢查參數是否匹配當前重載{return overload.Call(L);}}return LuaAPI.luaL_error(L, "invalid arguments to " + methodName);}catch (System.Reflection.TargetInvocationException e){return LuaAPI.luaL_error(L, "c# exception:" + e.InnerException.Message + ",stack:" + e.InnerException.StackTrace);}catch (System.Exception e){return LuaAPI.luaL_error(L, "c# exception:" + e.Message + ",stack:" + e.StackTrace);}}
//xlua檢查函數參數是否匹配代碼:
public bool Check(RealStatePtr L)
{int luaTop = LuaAPI.lua_gettop(L);      // 獲取 Lua 棧頂索引(參數總數)int luaStackPos = luaStackPosStart;     // 從指定起始位置開始檢查參數for (int i = 0; i < checkArray.Length; i++)  // 遍歷預定義的檢查函數數組{// 1. 跳過最后一個參數(若為可變參數)if ((i == (checkArray.Length - 1)) && (paramsType != null))break;// 2. 檢查參數缺失(非可選參數)if (luaStackPos > luaTop && !isOptionalArray[i])return false;  // 參數不足 → 檢查失敗// 3. 檢查參數類型不匹配else if (luaStackPos <= luaTop && !checkArray[i](L, luaStackPos))return false;  // 類型不匹配 → 檢查失敗// 4. 移動棧指針(僅當參數存在或非可選時)if (luaStackPos <= luaTop || !isOptionalArray[i])luaStackPos++;  // 指向下一個參數}// 5. 處理可變參數(params)情況return paramsType != null ? (luaStackPos < luaTop + 1 ? checkArray[checkArray.Length - 1](L, luaStackPos) : true) : luaStackPos == luaTop + 1;}

4. 關于table的rehash時機

我們都知道table是有數組和哈希兩部分組成,但是實際上數組部分和哈希部分都是使用數組數據結構實現的,也就是意味著他們的,只不過table的數組部分的數組存儲的是tValue,而哈希部分存儲的是一個Node節點。并且table初始化時如果沒有指定數組的長度,那么數值和哈希部分的長度都是0。那么后續增加數據的時候當如果儲存不下的時候就會觸發擴容-rehash。并且rehash都是按照2的指數增長。

local a = {}
for k = 1,5 dotable.insert(a,k,k)
end
-- 以上代碼執行后會觸發四次rehash,分別時添加1,2,3,5的時候

5.關于lua中面向對象

lua中繼承類的實例之間共享基類的靜態屬性。并且修改會實時同步所有實例。比如下段代碼中的A的M變量,所有繼承A的類的實例之間該屬性是共享的。

---@class A
---@field M _A
local A = class("A")
A.M = {A = 1,B = true}

lua中同一個類的所有實例的方法是共享的,在 Lua 的面向對象實現中,T1 和 T2 作為 B
類的實例,?共享類的方法,但各自擁有獨立的成員變量。這種設計是 Lua 面向對象編程的核心機制,其原理基于 ?元表(Metatable)??和 ?**__index 元方法**。比如:下列代碼的e是結果是true

---@class B:A
local B = class("B",A)function B:Execute()self.super.Execute(self)
endlocal T1 = B.new()
local T2 = B.new()
local e = T1.Execute==T2.Execute

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

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

相關文章

【Python數據采集】Python爬取小紅書搜索關鍵詞下面的所有筆記的內容、點贊數量、評論數量等數據,繪制詞云圖、詞頻分析、數據分析

Python爬取小紅書搜索關鍵詞下面的所有筆記的內容、點贊數量、評論數量等數據&#xff0c;繪制詞云圖、詞頻分析、數據分析 使用 Python 編寫一個簡單的爬蟲程序來從小紅書抓取與指定關鍵詞相關的筆記數據&#xff0c;并對這些數據進行基本的數據分析&#xff0c;包括詞云圖和…

最大子數組和問題-詳解Kadane算法

最大子數組和問題-詳解Kadane算法一、問題定義與暴力解法1.1 問題描述1.2 暴力解法的低效性二、Kadane算法的核心原理2.1 動態規劃思想的應用2.2 優化空間復雜度三、Kadane算法的Java實現3.1 基礎版本&#xff08;處理所有情況&#xff09;3.2 算法正確性驗證四、Kadane算法的變…

Mongoose網絡庫深度解析:從單線程到多線程的架構演進

0. 引言&#xff1a;C/C網絡編程的困境與突破 在C/C開發領域&#xff0c;網絡編程一直是一個令人頭疼的問題。與Python的requests庫或Go的net/http包不同&#xff0c;C/C缺乏統一的包管理體系和標準化的網絡API。開發者往往需要面對gcc/msvc版本差異、平臺兼容性問題、以及各種…

Jfinal+SQLite處理 sqlite數據庫執行FIND_IN_SET報錯

方法一原代碼sql " and FIND_IN_SET(s.M_ID," ids ")"; 修改為 sql " where s.M_ID"getInSql(ids);public static String getInSql(String ids) {String[] idArray ids.split(",");StringBuilder sql new StringBuilder(" I…

day24——Java高級技術深度解析:單元測試、反射、注解與動態代理

文章目錄一、單元測試&#xff1a;JUnit框架精要1.1 單元測試核心概念1.2 JUnit快速入門實戰基礎步驟&#xff1a;斷言機制驗證結果1.3 JUnit核心注解解析二、反射機制&#xff1a;框架設計的基石2.1 反射核心概念2.2 獲取Class對象的三種方式2.3 反射操作類成分獲取并執行構造…

網頁的性能優化,以及具體的應用場景

下面是每個性能優化技術的具體應用場景示例&#xff0c;結合代碼說明如何在實際項目中使用這些優化方法&#xff1a; 1. 批量DOM操作與DocumentFragment 應用場景&#xff1a;動態渲染大量列表項&#xff08;如評論區、商品列表&#xff09; 問題&#xff1a;逐個添加DOM元素會…

Fiddler 中文版 API 調試與性能優化實踐 官方中文網全程支持

在現代開發中&#xff0c;性能問題往往是產品上線后最容易被忽視的一環&#xff0c;尤其是API接口性能。一旦接口響應時間過長或在高并發場景下出現性能瓶頸&#xff0c;可能直接影響用戶體驗和系統穩定性。對于開發者來說&#xff0c;如何精確地找到瓶頸所在&#xff0c;如何模…

嵌入式硬件篇---機械臂運動學解算(3自由度)

實際 3 自由度機械臂的解算是機器人控制的核心&#xff0c;涉及運動學正解&#xff08;關節角度→末端位姿&#xff09;和逆解&#xff08;目標位姿→關節角度&#xff09;。以下從結構建模、解算方法、代碼實現和應用場景四個維度詳細展開&#xff0c;結合工業級機械臂的典型場…

在攝像機視圖中想像在普通 3D 視口里那樣隨意移動

有兩條最常用的方法&#xff1a;1. 「鎖定相機到視圖」(Lock Camera to View)步驟進入相機視圖&#xff1a;按 Numpad 0&#xff08;若無數字鍵盤&#xff0c;可在 Edit → Preferences → Input 勾選 Emulate Numpad 后用主鍵盤 0&#xff09;。右側呼出 N 面板&#xff0c;切…

An End-to-End Attention-Based Approach for Learning on Graphs NC 2025

NC 2025 | 一種基于端到端注意力機制的圖學習方法 Nature Communications IF=15.7 綜合性期刊 1區 參考:https://mp.weixin.qq.com/s/cZ-d8Sf8wtQ9wfcGOFimCg 今天介紹一篇發表在 Nature Communications 的圖學習論文《An end-to-end attention-based approach for learnin…

【牛客刷題】小紅的數字串

文章目錄 一、題目描述 1.1 輸入描述 1.2 輸出描述 1.3 示例1 二、高效解法 2.1 核心算法設計 2.2 算法設計理念 2.2.1 算法流程詳解 2.2.2 復雜度分析 2.3 算法優勢分析 2.3.1 關鍵優化點 2.3.2 正確性驗證 2.4 邊界處理 2.5 總結與擴展 一、題目描述 小紅拿到了一個數字串(由…

微算法科技技術創新,將量子圖像LSQb算法與量子加密技術相結合,構建更加安全的量子信息隱藏和傳輸系統

隨著信息技術的發展&#xff0c;數據的安全性變得尤為重要。在傳統計算模式下&#xff0c;即便采用復雜的加密算法&#xff0c;也難以完全抵御日益增長的網絡攻擊威脅。量子計算技術的出現為信息安全帶來了新的解決方案。然而&#xff0c;量子圖像處理領域仍面臨復雜度高、效率…

博客摘錄「 Springboot入門到精通(超詳細文檔)」2025年7月4日

1.Spring Boot返回Json數據及數據封裝1. Controller 中使用RestController注解即可返回 Json 格式的數據首先看看RestController注解包含了什么東西&#xff0c; ResponseBody 注解是將返回的數據結構轉換為 Json 格式Target({ElementType.TYPE}) Retention(RetentionPolicy.RU…

企業安全防護:堡壘機技術解析

目錄 一、堡壘機&#xff1a;企業IT運維的安全守門人 1.1 核心價值矩陣 1.2堡壘機典型部署架構 二、堡壘機如何構建安全防線 2.1 四層防護體系 2.2 關鍵工作流程 三、堡壘機關鍵技術指標對比表 四、智能堡壘機的發展趨勢 一、堡壘機&#xff1a;企業IT運維的安全守門人…

傳輸層協議 TCP

TCP 協議TCP 全稱為 "傳輸控制協議(Transmission Control Protocol"). 人如其名, 要對數據的傳輸進行一個詳細的控制TCP 協議段格式源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去32 位序號/32 位確認號4 位 TCP 報頭長度: 表示該 TCP 頭部有多少個 32 位 bit…

RT-Thread的概念和移植

一、操作系統的概念 操作系統&#xff08;英語&#xff1a;Operating System&#xff0c;縮寫&#xff1a;OS&#xff09;是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務來組織用戶交互的相互關聯的系統軟件程序。根據運行的環境&#xff0c;操作系統可以…

基于單片機傾角測量儀/角度測量/水平儀

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的高精度數字傾角測量儀。系統核心由傾角傳感器&#xff08;ADXL345傾…

深度學習 -- 初步認識Torch

深度學習 – 初步認識Torch 文章目錄深度學習 -- 初步認識Torch一&#xff0c;認識人工智能1.1 人工智能的本質1.2 人工智能的實現過程二&#xff0c;認識Torch2.1簡介2.2 概述2.3 Tensor的創建2.3.1 torch.tensor2.3.2 torch.Tensor三&#xff0c;創建線性和隨機張量3.1創建線…

BGP的“聰明選路”遇上了TCP的“路徑潔癖”,需人工調和

在路由器R1上有兩條外網&#xff0c;WAN1和WAN2。R1上做了域名分流功能&#xff0c;全局網址分到WAN1&#xff0c;指定域名分到WAN2&#xff08;優先級更高&#xff09;。癥狀是用戶反饋部分網頁無法打開。于是各種檢查嘗試...... 2天過去了......最終結論是&#xff1a;即使S…

ACWing算法筆記 | 二分

&#x1f50d; C 二分查找雙模板詳解&#xff1a;左閉右開 vs 左閉右閉&#xff08;二分筆記&#xff09;二分查找&#xff08;Binary Search&#xff09;是一類高效的搜索算法&#xff0c;在 O(log n) 的時間復雜度下查找答案&#xff0c;適用于單調性問題。C STL 的 lower_bo…