0

私はLuaにテーブルを操作する関数を持っており、テーブルにエントリを繰り返し追加しています。

function DoStuff()
    local table = {};

    for i = 1, 1000 do
        local name, value = GetSomething(i);

        if (CheckSomething(name, value))
           table[name] = value
        end;
    end;
end;

私はこれが速いことを知っています。Luaには優れたハッシュテーブルアルゴリズムがあります。しかし今、私は自分の関数の一部を分割する必要があるので、それを単体テストすることができます:

function DoStuff()
    local table = {};

    for i = 1, 1000 do
        local name, value = GetSomething(i);

        --split out checking so it's testable
        table = ParseTheThing(table, name, value); 
    end;
end;

Luaは参照によるパラメーターの受け渡しをサポートしていないことを知っています。代わりに、アイテムを追加する必要がある場合table、Luaはコピーを作成し、そのコピーを返す必要があります。

--Core checking function
function ParseTheThing(table, name, value)
   if (CheckSomething(name, value))
      table[name] = value
   end;

   return table;
end;

CheckSomethingしたがって、 Luaを呼び出すたびに、ガベージコレクションが必要な別のテーブルが作成されるようです。

またはそうでないかもしれません。たぶん、Lua参照によるパラメーターの受け渡しをサポートしており、私は単に次のように呼び出すことができます。

ParseTheThing(table, name, value); 

--Core checking function
function ParseTheThing(table, name, value)
   if (CheckSomething(name, value))
      table[name] = value
   end;
end;

コードをリファクタリングした場合、Luaのガベージコレクターはさらに多くの作業を強制されますか?


  • 質問で使用されている簡略化された例と、私が尋ねている質問を混同しないでください。
  • メモリ使用量やコレクションの数を測定する方法がないため、試すことができません。
4

1 に答える 1

5

Lua が参照によるパラメーターの受け渡しをサポートしていないことは知っています

「参照による」という用語は過負荷であり、多くの混乱を引き起こしています (特にJava の世界では、人々が意味の 1 つが存在することさえ認めることを拒否しているのを見てきました)。

参照渡しとは、次のことを意味します。

  1. オブジェクト自体ではなく、メモリ内のオブジェクトの場所を渡します。これが、C での「参照渡し」の意味です。この意味で、Java参照渡しを行い、Lua はそのタイプ (ユーザーデータ、テーブルなど) の多くについて参照渡しを行います。

  2. エイリアスへの変更が元の変数に反映されるような、変数のエイリアス。これは単に値渡しをしないということではありません。変数がオブジェクトの場所を保持している場合、エイリアスを介して別の場所を割り当てることができます。変数ではなくobjectへの参照を渡す #1 では、これを行うことはできません。これらのタイプの参照は、C#、C++ などでサポートされていますが、C や Lua ではサポートされていません。

もっと簡単に:

  1. 値渡し: 呼び出し元の関数のオブジェクトは、呼び出された関数が受け取ったオブジェクトのコピーです。
  2. 参照渡し^1: 呼び出し元の関数内のオブジェクトは、呼び出された関数によって変更できます。
  3. 参照渡し^2: 呼び出し元の関数の変数は、呼び出された関数によって変更できます。

代わりに、テーブルにアイテムを追加する必要がある場合

テーブルを渡すだけです。コピーではなく参照が渡されます。

于 2012-09-21T23:05:24.320 に答える