変数で指定された長さのゼロテーブルを作成する必要があります。 Pythonでは、私が書くことができる:反復なしでlua配列を作成する方法
ARR = [0] *サイズ
しかしLUAに、私はこのように行うことができますため
ローカルARR = {} を私は= 1、サイズが行う ARR [I] = 0 エンド
は私が行うことができます任意の方法があります。そのpythとLUAでスタイルで?皆さん、ありがとうございました。
変数で指定された長さのゼロテーブルを作成する必要があります。 Pythonでは、私が書くことができる:反復なしでlua配列を作成する方法
ARR = [0] *サイズ
しかしLUAに、私はこのように行うことができますため
ローカルARR = {} を私は= 1、サイズが行う ARR [I] = 0 エンド
は私が行うことができます任意の方法があります。そのpythとLUAでスタイルで?皆さん、ありがとうございました。
言語の構文を使用してこれを作成する方法はありません。代わりに、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を許可するという提案は良い提案ですが、答えは網羅的な解決策ではなくオプションを示しています。
' 'newArray(size、value)'を定義し、ループの前に 'value = value or 0'を追加してください。 – lhf
@lhf:これはPython構文と一致するように意図されており、Python構文は値を任意にしません。 –
@NicolBolas True!私はluaが独自の言語であり、そのスタイルはより密接になるので、lhfの提案された変更を行いました。ほとんどの言語で、堅牢なコードを作成するコンパイラ/インタプリタの機能を採用することは、良い考え方です。機能の乱用は、ワームの完全な別の原因(Cのマクロが一般的に悪用される機能として気になる)です。 – Aaron3468
ない、私はそれをお勧めしますが、あなたは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
メタメソッドはプライベートフィールドから値を取得し、要求された長さの配列を指定された値で作成し、それを返します。
まあ、複雑な解を気にしない場合は、local arr = load( 'return {' ..( '0'):rep(size).. '}')() – tonypdmtr
別の畳み込み解法はLua 5.3以来利用可能です: 'local arr = {table.unpack(setmetatable({}、{__ index = function()return 1 end})、1、size)}' –