In Lua kann das __index-Metamethod entweder eine Funktion oder eine Tabellenreferenz sein. Daher sind die folgenden Konstruktionen äquivalent:
foo = { a=1, b=2, c=3 }
bar = setmetatable({}, {__index = foo})
baz = setmetatable({}, {__index = function(_,x) return foo[x] end })
print(bar.a) -- 1
print(baz.b) -- 2
Es scheint, dass die Implementierung von baz
langsamer wäre.
Aber wie viel langsamer?
Ich kümmere mich nicht sehr um Implementierungsunterschiede. Was ich suche, ist der 'generelle' vergleichende Unterschied. Sprechen wir über eine lineare Erhöhung, eine Größenordnung oder mehrere Größenordnungen?
Zur Einordnung: Ich entwickle eine OOP-Bibliothek, in der in den meisten Fällen (95%) eine Tabelle ausreicht. Es gibt jedoch einen bestimmten Fall, in dem ich eine Funktion benötige. Die Kenntnis des Unterschieds wird mir dabei helfen zu entscheiden, ob ich die Bibliothek 'aufteile' (eine schnelle Bibliothek, die 95% der Anwendungen abdeckt, und ein Modul, das Funktionen für den Rest verwendet) oder einfach die Tabellenoption zugunsten der Funktion fallen lasse.
Dieses spezielle __index wird häufig verwendet (immer wenn eine Instanzmethode aufgerufen wird).
Falls das hilfreich ist, wird die Funktion, die ich verwenden werde, sehr klein sein, ähnlich wie diese:
function __index(t,x) return foo[x] or bar[x] end
Vielen Dank.