三、Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之間的區別


【寫在前面:本文主要講解這幾個容易混淆和忘記的概念之間的區別,並未做深入討論,歡迎大家提寶貴意見!】

  重點掌握 require,dofile,loadfile,其他的了解即可。

一、require

  1.功能:載入文件並執行代碼塊,對於相同的文件只執行一次

  2.調用:require(“filename”)

  注:尋找文件的路徑在package.path中,print(package.path)即可得到。

二、dofile

  1.功能:載入文件並執行代碼塊,對於相同的文件每次都會執行

  2.調用:dofile("filename")

  3.錯誤處理:如果代碼塊中有錯誤則會引發錯誤

  4.優點:對簡單任務而言,非常便捷

  5.缺點:每次載入文件時都會執行程序塊

  6.定位:內置操作,輔助函數

三、loadfile

  1.功能:載入文件但不執行代碼塊,對於相同的文件每次都會執行。只是編譯代碼,然后將編譯結果作為一個函數返回

  2.調用:loadfile("filename")

  3.錯誤處理:不引發錯誤,只返回錯誤值但不處理錯誤,即返回nil和錯誤消息

  4.優點:調用一次之后可以多次調用返回的結果(即函數),即“多次調用”只需編譯一次(注:這里的多次調用是指多次調用返回的函數,而不是多次調用loadfile)

    dofile可如下定義:

      function dofile(filename)

        local f = assert(loadfile(filename)) --調用loadfile(的返回結果)並可處理錯誤

        return f()

      end

  注:加載了程序塊並沒有定義其中的函數。在Lua中,函數定義是一種賦值操作,是在運行時才完成的操作。

           例如:一個文件test.lua中有一個函數 function foo(x) print(x) end ,執行如下代碼:

        f = loadfile(test.lua) --加載程序塊,此時還沒有定義函數foo

        f() --運行加載的程序塊,此時就定義了函數foo

                      foo("hello lua") -->hello lua --經過上面的步驟才能調用foo

四、loadstring

    與loadfile類似,不同的是loadstring是從一個字符串中讀取代碼,而非從文件中讀取,即loadfile的參數是一個文件名,而loadstring的參數是一個字符串,同樣返回的是一個函數。

    1.特點:功能強大,但開銷大;

    2.典型用處:執行外部代碼,如:用戶的輸入

    3.錯誤錯里:代碼中如果有語法錯誤就會返回nil

    4.理解:f = loadstring("i = i+1")  可理解為(但不完全是)f = function()  i = i+1  end  (注:這里的變量"i"是全局變量,不是指局部變量,如果沒有定義全局變量"i",調用f()則會報錯!,即loadstring不涉及詞法域)

      例如:

      i = 32

      local i = 1

      f = loadstring("i = i+1;print(i)")

      g = function() i = i+1;print(i) end 

      f() -->33 --不涉及詞法域

      g() -->2  --涉及詞法域

五、dostring

    類似dofile:加載並運行

六、loadlib(package.loadlib)

  提供所有Lua中關於動態連接的功能,是一個非常底層的函數

  1.功能:加載指定的庫,並將其鏈接入Lua,不會調用庫中的任何函數

  2.調用:f = package.loadlib(path,"functionname"):path動態庫的完整路徑,functionname函數名

  3.錯誤處理:返回nil及錯誤消息

七、load

  一般很少使用load    

     理解: load是loadfile 和 loadstring的原始函數,接受一個“讀取器函數”,並在內部調用它讀取程序塊,讀取器函數可分幾次返回一個程序塊,load會反復調用它直到返回nil為止。

              load不會引發錯誤,但程序塊中有錯誤的時候會返回nil及錯誤消息

     應用: 當程序塊不在文件中,或程序塊過大而無法載入到內存時才使用load

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM