2017-10-24 12 views
1

私はLuaには新しく、関数の宣言方法について少し混乱しています。Lua - 関数の宣言のバリエーション

これらの2つのバリエーションが動作するようです: -

第一変化

test = {calc = function (x,y) 
    z = x + y 
    return z 
end 
} 

result = test.calc (1,2) 
print (result) 

第二に変化

test = {} 

function test.calc(x,y) 
    z = x + y 
    return z 
end 

result = test.calc (1,2) 
print (result) 

特定のバリエーションを選択するのいずれかの意味がありますか?

+0

差がない、第一の変形例の補正: 'テスト= {CALC =関数(X、Y)Z = X + YがZ端を返す}' –

+0

また、使用'ローカルz = ...'。 – lhf

+0

これは謎です!そんなに学ぶのは大変です! – Zalokin

答えて

1

これらはまったく同じ効果があります。読みやすさに基づいてどちらか一方を選択してください。 (私は2番目を好む)

+0

と 'local test = {}'にはいくつかの違いがあります。この場合、funcitonはテーブル自体にアクセスできません。しかし、それは 'local test test = {}'によって修正することができます。 – moteus

0

ルアには関数宣言がありません。それは実行時にと評価されたときに関数値を生成する式(第1の変形)である関数定義を有する。他の構文形式は事実上、関数定義式と代入の組み合わせです。

この第3のバリエーションでは、暗黙的な第1のパラメータselfを加えたものです。これは、フィールドの「メソッド呼び出し」で使用するためのものです。メソッド呼び出しは、暗黙の第1引数としてフィールド(関数値)を保持しているテーブル値を渡す関数呼び出しの代替形式です。関数は、特に他のフィールドにアクセスするために参照できます。

第3変形例:方法

local test = { history = {} } 

function test:calc(x,y) 
    local z = x + y 
    table.insert(self.history, { x = x, y = y }) 
    return z 
end 

print(test.calc) 
local result = test:calc(1,2) 
print(result) 
print(test.history[1].x, test.history[1].y)