2016-03-25 9 views
3

Ich muss eine Null-Tabelle mit der Länge von einer Variablen angegeben erstellen. In Python kann ich schreiben:So erstellen Sie ein Lua-Array ohne Iteration

arr = [0] * Größe

Aber in lua, kann ich nur diese wie:

lokal arr = {} für i = 1, Größe tun arr [i] = 0 Ende

gibt es Möglichkeiten, das kann ich in lua mit pyth auf Stil? Danke euch allen.

+0

Nun, wenn Sie gewundene Lösungen nicht stört, gibt es auch dieses: local arr = load ('return {' .. ('0,'): rep (Größe) .. '}')() – tonypdmtr

+0

Eine andere verschachtelte Lösung ist seit Lua 5.3 verfügbar: 'local arr = {table.unpack (setmetatable ({}, {__ index = function() return 0 end}), 1, size)}' –

Antwort

5

Es scheint keine Möglichkeit zu geben, dies mithilfe der Syntax der Sprache zu erstellen. Erwägen Sie stattdessen, eine Funktion zu erstellen, die ein Array von size generiert. Dann kannst du einfach arr = newArray(5) oder ähnliches sagen.

function newArray (size) 
    local arr = {} 
    for i=1, size do 
     arr[i] = 0 
    end 
    return arr 
end 

Sie können diese Funktion erweitern ein Array mit einem beliebigen Wert initialisiert zu erstellen:

function newArray (size, value) 
    value = value or 0 
    local arr = {} 
    for i=1, size do 
     arr[i] = value 
    end 
    return arr 
end 

EDIT: Die obigen Beispiele sind nicht dazu gedacht, als perfekte Lösungen und ich entmutigen hoch Code kopieren ohne Einschränkungen ist es zu verstehen. Wenn Sie boolesche Werte zulassen möchten, ändern Sie die Funktion in der Tat entsprechend Ihren Anforderungen. Die Bearbeitung, die den Wert als optionales Argument hervorgebracht hat, war ein praktisches Beispiel. Der Vorschlag, dass der Code "falsch" zulässt, ist ein guter Vorschlag, aber die Antwort zeigt eher eine Option als eine erschöpfende Lösung.

+3

Besser machen 'value' optional: Definiere 'newArray (size, value)' und füge 'value = value oder 0' vor der Schleife hinzu. – lhf

+1

@lhf: Es ist beabsichtigt, die Python-Syntax anzupassen, und die Python-Syntax macht den Wert nicht optional. –

+0

@NicolBolas Wahr! Ich habe lhf's vorgeschlagene Änderung gemacht, weil Lua seine eigene Sprache ist und dieser Stil zusammenhängender sein wird. Umfassende Compiler/Interpreter-Funktionen, um robusten Code zu erstellen, ist eine gute Philosophie in den meisten Sprachen. Feature-Missbrauch ist eine andere Dose von Würmern vollständig (Makros in C kommen als häufig missbraucht Feature in den Sinn). – Aaron3468

0

Nicht, dass ich würde es empfehlen, aber man konnte ziemlich nah an Pythons Syntax in Lua erhalten:

local A = require"A" -- see below for the implementation of module "A" 

-- ... 

local t = A[0] * 10 

for i,v in ipairs(t) do 
    print(i, v) 
end 

Hier ist der Code für das Modul "A":

local M_meta = {} 
local M = setmetatable({}, M_meta) 

local function forbid_operation() -- to prevent mistakes 
    error("not a regular table, operation forbidden!") 
end 

local O_meta = { 
    __index = forbid_operation, 
    __newindex = forbid_operation, 
    __pairs = forbid_operation, 
    __ipairs = forbid_operation, 
    __mul = function(self, n) 
    if type(self) == "number" then 
     self, n = n, self -- swap values in case of e.g. `3 * A[0]` 
    end 
    local t, v = {}, self[ M_meta ] 
    for i = 1, n do 
     t[ i ] = v 
    end 
    return t 
    end, 
    __metatable = false, 
} 

local function index_or_call(self, v) 
    -- use M_table as a private key: no-one but this module 
    -- can access it, because it is local 
    return setmetatable({ [ M_meta ] = v }, O_meta) 
end 

M_meta.__index = index_or_call -- A[0] syntax 
M_meta.__call = index_or_call -- A(0) syntax is also allowed 
M_meta.__newindex = forbid_operation 
M_meta.__pairs = forbid_operation 
M_meta.__ipairs = forbid_operation 
M_meta.__metatable = false 

return M 

Das Modul tatsächlich gibt eine Tabelle mit einem angepassten Metamethode __index (und __call) zurück. Wenn __index oder __call aufgerufen wird, wird eine andere Tabelle mit dem angegebenen Wert zurückgegeben, der in einem privaten Feld und einem __mul metamethod dieses Mal gespeichert wird. Das Metamethod __mul ruft den Wert aus dem privaten Feld ab und erstellt das Array der angeforderten Länge mit dem angegebenen Wert und gibt es zurück.

Verwandte Themen