校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Lua中的源代碼預編譯淺析

Lua中的源代碼預編譯淺析

熱門標簽:武漢百應人工智能電銷機器人 如何利用高德地圖標注家 上海企業外呼系統排名 智能語音電銷的機器人 400手機電話免費辦理 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 百度地圖標注位置網站 開通400電話申請流程

盡管Lua被稱為是一種解釋型的語言,但Lua確實允許在運行源代碼之前,將源代碼預編譯成一種中間形式(類比Python的.pyc)。區別解釋型語言的主要特征在于編譯器是否是語言運行時庫的一部分,即是否有能力執行動態生成的代碼(Lua可以通過dofile執行Lua代碼)。

 其實,dofile的核心功能是由loadfile完成的,可以這樣來定義dofile:

loadfile并不是執行代碼,而只是編譯,返回一個函數,由dofile執行。
如果多次運行一個文件,可以只調用一次loadfile,重復調用其返回的函數即可。
  
另外一個函數,loadstring從字符串加載代碼:

復制代碼 代碼如下:

> f = loadstring('print "hello"')
> f()
hello

考察一下loadstring代碼的執行域
復制代碼 代碼如下:

> i = 1
> f = loadstring('i = i + 1')
> =i
1
  
--不要完了交互式命令行中,一行代碼默認一個block
  
> f = loadstring('i=i+1')
> do
>> local i =1
>> f()
>> print(i)
>> end
1
  
> do
>> local i = 1
>> local f = loadstring('i=i+1')
>> f()
>> print(i)
>> end
1

兩次運行,都是將global中的i加1.
可以這樣理解f:
復制代碼 代碼如下:

function f()
i = i+1
end

但如果直接替換,其結果并不一致。
復制代碼 代碼如下:

> do
>> local i =1
>> function f()
>> i = i + 1
>> end
>> f()
>> print(i)
>> end
2

可以認為,loadstring編譯出的函數,會關聯global scope,因而不會表現出閉包的特性,故而,應該盡量不使用這種方式!
  
另外,如果語法有誤,那么loadstring返回nil。
可以使用assert(loadstring(s))()的方式。
如果參數不是nil/false,返回參數,否則assert error;
  
深究一下loadfile和loadstring就會知道,Lua中其實有一個load函數,后者接收一個reader function,調用其讀取代碼;

您可能感興趣的文章:
  • Lua中使用元表(metatable)執行算術類元方法實例
  • Lua簡介、編譯安裝教程及變量等語法介紹
  • Mac平臺中編譯安裝Lua運行環境及Hello Lua實例
  • Lua中編譯執行代碼相關的函數詳解

標簽:江西 延邊 黑龍江 新余 嘉峪關 武漢 宜賓 張掖

巨人網絡通訊聲明:本文標題《Lua中的源代碼預編譯淺析》,本文關鍵詞  Lua,中的,源代碼,預,編譯,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中的源代碼預編譯淺析》相關的同類信息!
  • 本頁收集關于Lua中的源代碼預編譯淺析的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 托里县| 靖安县| 沿河| 丰顺县| 昭平县| 连江县| 安图县| 谢通门县| 普兰县| 孟州市| 广东省| 宁远县| 海安县| 招远市| 玉田县| 成武县| 余江县| 淮安市| 龙门县| 长兴县| 金华市| 黄平县| 鱼台县| 东山县| 台安县| 吴桥县| 井陉县| 阜新| 永宁县| 卢湾区| 体育| 涪陵区| 兴安县| 清涧县| 沛县| 阜宁县| 永州市| 霍山县| 托里县| 玉环县| 蓬溪县|