2017-01-22 4 views
3

私はこのコードを持っていなくても、同じテーブルである:なぜそれがプロトタイプ

function createRect(x, y, w, h) 
    local rect = { 
    type = "rect", 
    x = x, 
    y = y, 
    w = w, 
    h = h, 
    translate = function(rect, vector) 
     assert(vector.type == "vector2d") 
     local rect = shapes.createRect(rect.x + vector.x, rect.y + vector.y, rect.w, rect.h) 
    end, 
    } 

    return rect 
end 

translate = function(rect, vector) 
    assert(vector.type == "vector2d") 
    local rect = shapes.createRect(rect.x + vector.x, rect.y + vector.y, rect.w, rect.h) 
end 

local o = createRect(2,3,4,5) 
local q = createRect(2,3,4,5) 

print(o.translate, q.translate, translate) 

いくつかの非常に簡単なコードで、Luaの中でのテストファクトリ関数に書き込まれ、JSの非常に連想させますモジュールパターン。工場の機能について話すときに人々が通常不平を言うのは、メモリフットプリントです。 oqはちょうど割り当てられているので、もちろんそれらは異なったtranslate()の機能を持っています。

function: 0x7fcdbe600d50  function: 0x7fcdbe600d50  function: 0x7fcdbe600d90 

これはなぜですか?A:私が間違って証明されたが これはどうしたらできますか?私は、しかし、彼らは同じですが、異なる機能するo.translateq.translateであると仮定...

答えて

5

は、これはどのようにさえすることができますか?私は

は、通常は、しかし、Luaの5.2は、一定の条件が満たされた場合に無名関数をキャッシュすることができる最適化を導入し、正確である...しかし、彼らは同じですが、異なる機能するo.translateq.translateであると想定しました。具体的には、参照する値が構築時に変更されない場合、その無名関数の最初に作成されたインスタンスが再利用されます。 repl.itであなたの例を実行する

、Luaの5.1は、一つの可能​​な出力としてこれを示しています

function: 0xb81f30 function: 0xb81f00 function: 0xb82ca0 

しかしmelpon.org/wandbox、Luaの5.2+の下でそれを実行し、示しています。あなたの例では

function: 0x14f0650 function: 0x14f0650 function: 0x14efb40 

を、 createRectは、すべての呼び出しに対して異なるrectテーブルを作成して返しますが、フィールドrect.translateには、この最適化のためにlua値と同じ無名関数が割り当てられています。

また

を見ます
関連する問題