2016-04-13 3 views
2

私は初心者のプログラマで、ちょうどluaとDefoldで始まり、基本的にオブジェクトと呼ばれるテーブルを持っています。テーブルメソッドのペアを使用して、そしてその中でループのために、私は項目にアクセスし、それを使用しようと、私はエラーが言ってます:Lua - ローカル 'lvlObj'(ユーザデータ値)のインデックスを作成しようとしました

ERROR:SCRIPT: level/controller.script:57: attempt to index local 'lvlObj' (a userdata value) 

は、とにかく、私はこのエラーがから派生何を思っていた、と私はどのように修正すればよいですそれ。 (pipe_resetがブール変数で、エラーとは何の関係もないはずです)

pipe_reset = false 

local objects = {} 

... xがテーブルであれば、後でコード

if pipe_reset then 
    for k in pairs(objects) do 
     local lvlObj = objects [k] 
     lvlObj.delete() 
     objects [k] = nil 
    end 
    pipe_reset = false 
end 
+0

あなたがオブジェクトテーブルに置くものを共有してください。そのユーザーデータ型には明らかに存在しない関数を呼び出そうとしています。 – Piglet

答えて

2

インデックスできないユーザーデータ型のインデックスを作成しようとすると、このエラーが発生します。

私はDefoldについて知らないけど、delete()関数のAPIリファレンスを検索しました。私が見つけたのはgo.delete()でした。

あなたは十分な情報を提供していないので、私はこれがあなたが使いたい機能だと推測できます。

詳細はhttp://www.defold.com/ref/go/#go.delete%28%5Bid%5D%29 を参照してください。

deleteは、オブジェクトタイプのメンバーではなく、テーブルのメンバーです。したがって、代わりにgo.delete()を呼び出す必要があります。 go.delete()はオプションのidをとります。関数go.get_id()もあります。

は、私はあなたが

local id = go.get_id(myFancyObject) 
go.delete(id) 

または多分あなたのオブジェクトalreadは、そのIDがあるような何かを行うことができますね? そう

go.delete(myFancyObject) 

は多分ちょうどあなたの例で試すだけでなく

を働くかもしれない:

for _, id in objects do 
    go.delete(id) 
end 
1

にあなたが唯一の「XY」を使用することができます(x ["y"]と等価です)、明らかにそうではありません。 "delete"キーを持つテーブルであると仮定すると、そのテーブルが作成された場所を調べたり、オブジェクトにテーブル以外の値があるかどうかを調べたりします。そうでない場合は、代わりにtable.remove()を使用しようとします。

+0

この場合、私はオブジェクトobject.kを試しましたが、エラーが発生しました: level/controller.script:56:フィールド 'k'(ゼロ値)のインデックスを作成しようとしました –

+0

objects.kは 'objects [k] '、これは' objects ["k"] 'に相当します。これは、値" k "を使って何かをマップしたことがわかっていて、その特定のものにアクセスしたい場合に便利です。正直なところ、この文脈ではドット表記法については心配しません。 – sowrd299

+0

彼は明らかにテーブルからオブジェクトを削除するためにオブジェクトの内部にあるユーザデータを削除しようとします。したがって、table.removeは彼を全く助けません。 – Piglet

関連する問題