lua-リファレンス転送と値転送


function test1(tt)
    tt = {1, 3, 5}
end

function test2(tt)
    tt[1] = 2
    tt["a"] = "hello"
end


t = {4, 5, 6}

test1(t)

for k,v in pairs(t) do
    print(v)
end

print("------")

t = {4, 5, 6}

test2(t)

for k,v in pairs(t) do
    print(v)
end

luaにおけるtableの参照伝達は、そのtableオブジェクトの内部要素を修正することのみであり、tableオブジェクトのコピー操作では、参照伝達の効果は得られない.
値伝達とは、実はコピー伝達であり、関数呼び出し時に関数スタックで実パラメータの値を形パラメータにコピーするので、形パラメータの修正はもちろん実パラメータに影響しません.
関数の内部修正を行うには、外部で表示される方法の1つは、ここのtableの内部要素のようにアドレスを渡すことであり、もう1つは参照を渡すことであり、参照伝達にはcの&参照伝達記号のような言語レベルのサポートが必要であり、この変数がコピー伝達ではなく、パラメータが実パラメータの別名であることを示す.(実は下層の実装にはポインタが使われています)