Lua中編譯執行代碼相關的函數詳解

PC教程網】關于Lua中編譯執行代碼相關的函數詳解_下列代碼的編譯或執行結果是介紹:可以說Lua之所以稱為是一種解釋型的語言,正是因為有諸如load這樣的函數,因為這樣的函數使得Lua可以執行動態生成的代碼。下面具體來分析這些函數。 load函數 load函數原型如下: 教,下面小編為您針對Lua中編譯執行代碼相關的函數詳解進行分享:

可以說Lua之所以稱為是一種解釋型的語言,正是因為有諸如load這樣的函數,因為這樣的函數使得Lua可以執行動態生成的代碼。下面具體來分析這些函數。

load函數

   load函數原型如下:

教程實例 代碼如下:

load (chunk [, chunkname [, mode [, env]]]) 

 該函數加載一個chunk,如果沒有錯誤,則返回一個函數。如果傳入chunk的值是一個字符串,則就加載這個字符串;如果傳入chunk的值是一個函數,則這個函數必須返回一個字符串,并且load會一直調用這個函數,直到這個函數返回空字符串或nil,load會把每次函數的返回結果連接起來作為chunk去加載。

如果沒有語法錯誤,則load返回chunk對于的函數,否則返回nil和對應的錯誤信息。如果返回的函數有upvalue,則第一個upvalue的值被設置成傳入的參數env,若沒有傳入這個參數的值,則第一個upvalue的值為全局環境。返回的函數upvalue不會任何其他函數共享。

    參數chunkname作為錯誤信息的chunk的名字,用于調試。若chunk是字符串,則chunkname默認值是變量chunk的值,否則是=(load)。參數mode決定了傳入給chunk的值是文本或二進制數據。如果是”b”,則傳給chunk的值必須是二進制數據(比如可以使用string.dump(foo)得到相應函數的二進制數據,然后傳遞給load),如果是”t”,而必須是文本數據,如果是”bt”,則文件或二進制數據都可以。默認值是”bt”。

    Lua不會檢測二進制數據的穩定性,因此惡意的二進制數據可能導致Lua解釋器Crash。

loadfile函數

    函數原型如下:

教程實例 代碼如下:

loadfile ([filename [, mode [, env]]]) 

 該函數類似于load,但是從文件filename或標準輸入(若filename為空)中活動chunk加載。
dofile函數
    函數原型如下:

教程實例 代碼如下:

dofile ([filename]) 

 讀取文件filename的內容,并把它作為lua的chunk執行。如果沒傳入參數,則從標準輸入中讀取執行內容。返回值跟chunk執行后返回的值相同。如果出現錯誤,dofile會把錯誤信息傳遞給它的調用者。也就是說,dofile在無保護模式下執行。注意該函數不同于loadfile,loadfile只是返回一個函數,并不會執行,并且出現錯誤時,loadfile會返回一個錯誤信息,而不會傳遞給它的調用者。總之、loadfile會從一個文件中加載Lua代碼塊,但不會運行代碼,只是編譯代碼,然后將編譯結果從一個函數返回。而dofile除了編譯代碼外,還會運行返回的結果。
    上面討論的Lua層面的編譯執行相關的函數,對應的C API相關函數有:lua_load、luaL_loadfilex、luaL_loadfile和luaL_dofile,這些函數非常類似對應的Lua層函數。

loadstring函數

    函數原型如下:

教程實例 代碼如下:

loadstring (string [, chunkname]) 

  該函數通用類似于load,它等價于給load函數傳遞字符串做作為參數。為了加載和運行一個字符串,可以這些寫:

教程實例 代碼如下:

assert(loadstring(s))() 

注意該函數在Lua5.2被刪除了,因為它完全可被load替代。

以上所述就是本文的全部內容了,希望對大家熟練掌握lua能夠有所幫助。

相關教程

C#中Byte轉換相關的函數

1、將一個對象轉換為byte對象 public static byte GetByte(object o){byte retInt = 0;if (o != null){byte tmp;if (byte.TryParse(o.ToString().Trim(), out tmp)){retInt = tmp;}}return retInt;} 2、將一個十六進制字符串轉換為b …

Lua教程(六):編譯執行與錯誤

1. 編譯: Lua中提供了dofile函數,它是一種內置的操作,用于運行Lua代碼塊。但實際上dofile只是一個輔助函數,loadfile才是真正的核心函數。相比于dofile,loadfile只是從指定的文件中加載 …

關于動態執行代碼(js的Eval)實例詳解

熟悉javascript的朋友對Eval()函數可能都不會陌生,我們可以用它來實現動態代碼的執行,我自己甚至寫過一個網頁專門用來計算算術表達式的,計算能力上比google、baidu的計算器還要好一 …

JS實現文檔加載完成后執行代碼

在執行某些操作的時候,需要當文檔完全加載完成之后再去執行,否則可能出現意向不到的情況,先看一段代碼實例: !DOCTYPE htmlhtmlheadmeta charset=" utf-8"title腳本之家/titlestyle type="text/css …

JavaScript實現向setTimeout執行代碼傳遞參數的方法

本文實例講述了JavaScript實現向setTimeout執行代碼傳遞參數的方法。分享給大家供大家參考。具體分析如下: setTimeout函數是javascript中實現動態效果最關鍵的函數。但昨天在寫代碼的時候 …

PHP間隔一段時間執行代碼的方法

本文實例講述了PHP間隔一段時間執行代碼的方法。分享給大家供大家參考。具體分析如下: PHP如何設置每隔一段時間自動執行某段代碼?例如定時生成靜態文件之類的,這就需要設置休 …

解釋執行和編譯執行的區別?

一:編譯器 編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器,這時我們把程序稱為 …

sql server代理中作業執行SSIS包失敗的解決辦法

RT,執行失敗了,總是只提示一句“以xxxx用戶身份執行失敗”,很難找原因。 引用 http://bbs.csdn.net/topics/300059148 Sql2005如何用dtexec運行ssis(DTS)包 一、首先在Business Intelligence中設計好包,并調 …

一行代碼實現IOS 3DES加密解密

一行代碼實現IOS 3DES加密解密

3DES(或稱為Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當于是對每個數據塊應用三次DES加密算法。由于計算機運算能力的增強,原版DES密碼的 …

内蒙古十一选五任五推荐号