0

コロナSDKを使用しています。コンポーネントをパラメーターとして受け取り、そのように削除する関数を書きたいと思います。

function removeComponent(component)
    if component then component:removeSelf() end
    component = nil
end

まあ、それは機能しますが、この関数を使用した後、私のパラメーターは nil になりません。おそらく参考までに渡さなければならないのですが、コロナでそれが可能かどうかはわかりません。

4

4 に答える 4

4

あなたの例に示されているように、これは実際には意味がありません。

正確に何を達成しようとしていますか?コンポーネントはグローバルですか? それともテーブルのキー?

あなたの例では、 component は関数内のローカル変数の名前です。あなたcomponent = nilだけがローカル変数から値を削除するため、失われます。

グローバルな効果が必要な場合は、削除する変数の名前を文字列として渡す必要があります。

function removeComponent(component)
    if _G[component] then -- exists globally?
         _G[component]:removeSelf()
    end
    _G[component] = nil
end

このスタイルのプログラミング (この種のものにグローバル テーブルを使用する) は、一般的には良い考えではないことに注意してください。最悪の場合、標準関数のようなものを印刷としてザッピングすることになります。

したがって、独自のテーブルに入れ、それを関数に渡すことをお勧めします。

于 2013-10-17T14:16:37.070 に答える
0

Lua は参照渡しをサポートしていませんが、戻り値をサポートしているため、この慣用的なアプローチを使用していつでも目的を達成できます。

function removeComponent(component)
    if component then component:removeSelf() end
    return nil
end

そして、次のように呼び出します。

a = removeComponent(a)

編集: Lua は複数の戻り値と複数の代入をサポートしているため、参照渡しは実際には必要ないことも指摘しておく価値があります。複数のアイテムを更新する必要がある場合は、それらを渡して返し、 a,b = myFunction(a,b) として呼び出しを行います

于 2014-03-15T15:03:38.907 に答える
0

他の言語とまったく違いはありません。参照による値の受け渡し (たとえば C++ の場合) は、プログラムがこの同じ値の別のコピーを別の場所に保持するのを止めることはありません。

私はコロナについて何も知りませんが、これは実際にはコロナの質問ではなく、Lua スタイルの質問です。ただし、私が書いた場合は、「コンポーネント」のユーザーデータまたは基になる値が自動的にクリアされるようにします。ユーザーデータが再度アクセスされた場合、無効なユーザーデータの再利用について不平を言うエラーがスローされるはずです。

于 2013-10-17T14:27:26.250 に答える
0

私はこのコードを書きました:

local component = display.newCircle(100, 100, 100);

local function removeComponent(c)
  if component then component:removeSelf() end
    component = nil
end

removeComponent(component)
if component == nil then print("Component is nil") else print("Component is not nil") end

そして、「Component is nil」と出力します。おそらく、コンポーネントのコピーを別の場所に持っているか、関数 removeComponent などを呼び出すのを忘れている可能性があります。コードをもっと見る必要がある

于 2013-10-18T10:58:07.533 に答える