lua-函數作爲表元素

          (如有錯誤請聯繫我更正,以免誤導他人!)
      lua中函數作爲表中元素時有三種定義方式與兩種調用方式
      定義方式:
      ①tab.func=function ( 參數)
                -- body
          end
      ②function tab.func( 參數)
                -- body
          end
         ③function tab:func( 參數)
                -- body
          end
其中,①②兩種定義方式與非表元素的函數的定義一樣。方式③採用‘:’來定義,實際上隱藏了一個形參的聲明,這個形參會截獲調用函數時的第一個實參並把它賦值給self。
        調用方式:
      ①tab.func(參數)
      ②tab:func(參數)
其中,①調用方式與非表元素的函數的調用一樣。方式②採用‘:’來調用函數,實際上隱式的把tab自己當作第一個實參傳遞,即tab:func(參數)相當於tab.func(tab,參數)

       下面我們來看幾段代碼:
tab={}
function tab.func( a,b )
	print(a,b)
end
tab.func("第一個參數","第二個參數")

很明顯,這段代碼的輸出爲"第一個參數 第二個參數"現在,我們保持函數定義方式不變改變函數調用方式爲:tab:func("a","b")
輸出結果變爲:"table: 00837338 第一個參數",其中table: 00837338tab的地址。這是因爲,我們改爲使用':'的方式調用函數時,隱式的把tab作爲第一個實參傳遞給了函數,即a=tab,b="第一個參數",參數("第二個參數")則被拋棄了。
<span style="color:#000000;">tab={}
function tab:func( a,b )
	print(a,b)
end
tab:func("第一個參數","第二個參數")
</span>
這次,我們採用了第三種方式定義函數,採用第二種調用方式調用函數。輸出結果爲"第一個參數 第二個參數"
現在,我們仍然保持函數定義方式不變,改變函數調用方式爲:tab.func("a","b")
輸出結果變爲:"第二個參數 nil"。這是因爲,我們用第三種方式定義函數,則隱式地多出一個形參,假設這個形參的名字爲hide。則定義函數時tab:func(a,b)就相當於tab.func(hide,a,b)。那麼當我們使用'.'來調用函數時,我們只傳入了兩個參數,其中參數"第一個參數"傳遞給了hide,參數"第二個參數"傳遞給了a,最後,nil作爲參數傳遞給了b
同樣的,在沒改變函數調用方式之前,我們採用‘:’的方式定義和調用函數。故調用時隱式傳遞的參數傳遞給了定義時隱式定義的形參。
tab={str="我是字符串"}
function tab:func()
	print(self.str)
end
tab:func()
使用':'的方式定義和調用函數,函數接受到tab自己並賦值給self(self相當於c++和java中的this)。故輸出爲"我是字符串"
我們也可以改變函數定義爲下面的方式達到一樣的效果:
function tab.func(myself)
	print(myself.str)
end




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章