理解Lua中點號和冒號的區別及適用場合

Lua中點號和冒號的應用在函數的定義和調用這兩種場合可以互相替換,拋磚引玉,先給出Lua5.3參考手冊對於點號冒號區別的解釋,例子略有簡化:

函數的定義:冒號 語法可以用來定義 方法, 就是說,函數可以有一個隱式的形參 self。 因此,如下語句

function f(params) body end是這樣一種寫法的語法糖function f(self, params) body end

函數的調用:冒號 可以用來調用 "方法"。 這是 Lua 支持的一種語法糖。 像 table:func(args) 這個樣子, 被解釋成 table.func(table,args)

下面例子說明了冒號之於點號是一種語法糖關係,起到了簡化編碼的作用

    --點號
    local player1 = {level = 1}
    function player1.setLevel(self, lv) --函數定義使用點號,需傳表自身做型參,這裏不一定用self也可起其他名字
        self.level = lv
    end
    player1.setLevel(player1, 15)       --等價於:player1:setLevel(15)
    print("After player1.setLevel, player1.level = ",player1.level)
    --冒號
    local player2 = {level = 1}
    function player2:setLevel(lv)       --函數定義使用冒號,無需傳入表自身,可通過self.快速訪問
        self.level = lv
    end
    player2:setLevel(20)                --等價於:player2.setLevel(player2,20)
    print("After player2:setLevel, player2.level = ",player2.level)

仔細品讀這個例子,可以看出函數定義和調用使用點號和冒號兩者可以互換,也可以混合使用(點號定義冒號調用,或者冒號定義點號調用)當然這種做法不提倡沒有必要。

現在還有個問題,模塊需要定義一些函數時,什麼時候適合使用冒號,什麼時候適合使用點號?

上面的例子有個模塊需要訪問自身成員變量的需求,再來看一個模塊不需要訪問成員變量的例子:

    --點號
    local calculator1 = {}
    function calculator1.add(a, b)
        return a + b
    end
    print("calculator1.add(1, 2) = " .. calculator1.add(1, 2))
    --冒號
    local calculator2 = {}
    function calculator2:add(a, b)
        return a + b
    end
    print("calculator2:add(1, 2) = " .. calculator2:add(1, 2))

可以看出當模塊不需要訪問自身成員時,從定義到調用都和模塊無關,因此無需使用冒號語法糖,僅用點號即可。

總結:

1.冒號和點號應用於函數的定義和調用兩種場合,冒號是點號的語法糖,冒號相比於點號起到簡化編碼的作用。

2.在定義時冒號相比於點號第一個參數默認傳個形參self(也可改名,含義是模塊本身),調用時冒號相比於點號第一個參數默認傳個實參模塊名本身

3.模塊需要訪問自身成員變量時,使用冒號定義;模塊無需訪問自身成員變量時,使用點號定義。

4.冒號和點號可以混合使用,但是不提倡沒必要

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