1

「C」ユーザーデータ配列構造を書いています。セッターとゲッターとして、ここで説明されているように、通常の配列アクセス (u[0] = 1 u[0]) が必要です: [c array share][1] lua と C の間で配列を共有します。そのためには、__index と __newindex を set に設定し、c の関数を取得する必要があります。

さらに、「u:mymethod() のように」オブジェクト指向アクセスも必要です。私の問題は、メタテーブル自体に __index を設定する必要があることです。

両方を達成する方法はありますか?

4

1 に答える 1

4

これを実現するために考えられる多くの方法の 1 つにすぎません。

local userdata = { _array = { "A", "B", "C" } }
local mt = { }
local methods = { }

function mt.__index(userdata, k)
    if methods[k] then
        return methods[k]
    else
        return rawget(userdata, "_array")[k]
    end
end

function mt.__newindex(userdata, k, v)
    if methods[k] then
        error "can't assign to method!"
    else
        rawget(userdata, "_array")[k] = v
    end
end

function methods.count(userdata)
    return #rawget(userdata, "_array")
end

setmetatable(userdata, mt)

userdata[3] = "Z"

print(userdata[1])
print(userdata[2])
print(userdata[3])
print(userdata:count())

userdata.count = 0

編集: lhf がコメントで指摘したように、メタテーブルを __index テーブルとして使用することは危険ではありません。c メソッドは、自分が操作するものを常にチェックする必要があるためです。

于 2013-05-01T16:06:27.923 に答える