2016-03-25 16 views
3

変数で指定された長さのゼロテーブルを作成する必要があります。 Pythonでは、私が書くことができる:反復なしでlua配列を作成する方法

ARR = [0] *サイズ

しかしLUAに、私はこのように行うことができますため

ローカルARR = {} を私は= 1、サイズが行う ARR [I] = 0 エンド

は私が行うことができます任意の方法があります。そのpythとLUAでスタイルで?皆さん、ありがとうございました。

+0

まあ、複雑な解を気にしない場合は、local arr = load( 'return {' ..( '0'):rep(size).. '}')() – tonypdmtr

+0

別の畳み込み解法はLua 5.3以来利用可能です: 'local arr = {table.unpack(setmetatable({}、{__ index = function()return 1 end})、1、size)}' –

答えて

5

言語の構文を使用してこれを作成する方法はありません。代わりに、sizeの配列を生成する関数を作成することを検討してください。次に、単にarr = newArray(5)またはそれに類すると言うことができます。

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

あなたは任意の値で初期化された配列を作成するには、この機能を拡張することができます

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

EDITを:上記の例では、完璧な解決策として意図されていないと私は非常にそれが限界だ理解せずにコードをコピー落胆します。実際、ブール値を許可する必要がある場合は、必要に応じて関数を変更してください。値をオプションの引数にした編集は便利な例でした。コードがfalseを許可するという提案は良い提案ですが、答えは網羅的な解決策ではなくオプションを示しています。

+3

' 'newArray(size、value)'を定義し、ループの前に 'value = value or 0'を追加してください。 – lhf

+1

@lhf:これはPython構文と一致するように意図されており、Python構文は値を任意にしません。 –

+0

@NicolBolas True!私はluaが独自の言語であり、そのスタイルはより密接になるので、lhfの提案された変更を行いました。ほとんどの言語で、堅牢なコードを作成するコンパイラ/インタプリタの機能を採用することは、良い考え方です。機能の乱用は、ワームの完全な別の原因(Cのマクロが一般的に悪用される機能として気になる)です。 – Aaron3468

0

ない、私はそれをお勧めしますが、あなたはLuaの中でPythonの構文にかなり近づくことができること:実際に

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 

モジュール:ここで

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 

は「A」モジュールのコードですカスタマイズされた__index(および__call)メタメソッドを持つテーブルを返します。 __indexまたは__callが呼び出されると、プライベートフィールドに格納された特定の値と今回は__mulメタメソッドが格納された別のテーブルが返されます。 __mulメタメソッドはプライベートフィールドから値を取得し、要求された長さの配列を指定された値で作成し、それを返します。

関連する問題