Lua函式的呼叫( 和 的呼叫區別)

2021-08-02 05:50:50 字數 1944 閱讀 6657

本人稍加修改。

lua中類的函式定義方式有三種方法:

定義方式:

①tab.func=function ( 引數)

– body

end②function tab.func( 引數)

– body

end③function tab:func( 引數)

– body

end其中,①②兩種定義方式與普通函式的定義一樣。

方式③採用『:』來定義,實際上隱藏了乙個形參的宣告,這個形參會截獲呼叫函式時的第乙個實參並把它賦值給self

lua中類的函式使用方式有兩種方法:

①tab.func(引數)

②tab:func(引數)

其中,①呼叫方式與普通函式的呼叫一樣。

方式②採用『:』來呼叫函式,實際上隱式的把tab自己當作第乙個實參傳遞即tab:func(引數)相當於tab.func(tab,引數)

下面我們來看**演示:

tab={}  

function tab.func( a,b )

print(a,b)

end

tab.func("第乙個引數","第二個引數")

大家可以自己演示一下,上面的輸出就是「第乙個引數」,「第二個引數」。

接著將最後一句的呼叫,換為

tab:func("第乙個引數","第二個引數")
此時的輸出結果就是:

table: 008ab9c8 第乙個引數

這是因為,我們改為使用』:'的方式呼叫函式時,隱式的把tab本身作為第乙個實參傳遞給了函式,即**a=tab,b=「第乙個引數」,引數(「第二個引數」)**則被拋棄了。

接著我們再換個定義的方式:

tab={}

function tab:func( a,b )

print(a,b)

end

tab:func("第乙個引數","第二個引數")

可以看到,我們這裡定義類的函式方式,是使用 : 定義的

輸出結果為"第乙個引數 第二個引數"。

現在我們改變呼叫的方式,即將上面最後一行的呼叫改為如下:

tab.func("a","b")
輸出結果變為:「第二個引數 nil」。

這是因為,我們用**「:」方式定義函式**,則隱式地多出乙個形參,假設這個形參的名字為hide。則定義函式時tab:func(a,b)就相當於tab.func(hide,a,b)

那麼當我們使用**"."來呼叫函式時,我們只傳入了兩個引數,其中引數"第乙個引數"傳遞給了hide,引數"第二個引數"傳遞給了a,最後,nil作為引數傳遞給了b。**

在沒改變函式呼叫方式之前,我們採用**『:』的方式定義和呼叫函式**。呼叫時傳遞自身引數給了定義時隱式定義的形參。 即呼叫時為:tab:func(tab,「第乙個引數」,「第二個引數」)

使用":"定義類的函式時:

隱藏了乙個形參的宣告,這個形參會截獲呼叫函式時的第乙個實參並把它賦值給self

使用『:』來呼叫函式:

實際上隱式的把自己當作第乙個實參傳遞即tab:func(引數)相當於tab.func(tab,引數)

Lua 點呼叫和冒號呼叫的區別

object.func name object.func name arg1,arg2.object func name object func name self,arg1,arg2.點定義函式 需要顯示傳遞或接收self 冒號定義函式 可以省略self引數 冒號的作用 定義時,給函式新增隱藏的第...

Lua中使用 和 呼叫函式的區別

tb.print和tb print的含義略微不同,呼叫函式會多傳遞進去乙個self進去,差不多相當於oop裡面的成員函式呼叫.但是和oop裡面成程式設計客棧員函式 非成員函式不同的是,lua裡面的程式設計客棧非成員函式.呼叫,他不是靜態的.tb物件有乙個print function成員,當tb是ni...

系統呼叫和函式呼叫的區別

作業系統服務的程式設計介面 通常由高階語言編寫 c或c 程式訪問通常通過高層次 的api介面 c標準庫的庫函式 而不是直接進行系統呼叫 每個系統呼叫對應乙個系統呼叫編號 系統呼叫 1.使用int和iret指令,核心和應用程式使用的是不同的堆疊,因此存在堆疊的切換,從使用者態切換到核心態,從而可以使用...